LINUX.ORG.RU

Упражнение из SICP (2).


0

0

[code=scheme][code] (define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x)) (define (improve guess x) (average guess (/ x guess))) (define (average x y) (/ (+ x y) 2 (define (good-enough? guess x) (< (abs (- (square guess) x)) 0.001)) (define (sqrt x) (sqrt-iter 1.0 x)) (define (square x) (* x x)) [/code]

Так вот, что мне смущает. [code=scheme][code](if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))[/code]

Разве не идёт всё в порядке (if [предикат] [следствие] [альтернатива])?

Так где тут следствие, а где альтернатива? Я завис и не могу понять это уже очень долго.

Все правильно. Если guess уже достаточно, то мы его и возвращаем, иначе улучшаем нашу догадку. Или тебе непонятен сам алгоритм?

alg0rythm
()

>(if [предикат] [следствие] [альтернатива])?

(if (good-enough? guess x) guess (sqrt-iter (improve guess x) x))

предикат - (good-enough? guess x)

следствие - guess

альтернатива - (sqrt-iter (improve guess x) x)

anonymous
()

Спасибо вам. Я с чего-то, вдруг решил, что в (if (good-enough? guess x) - [guess x] и есть следствие, а good-enough? - предикат.

Теперь всё стало понятно.

Slowbrozo
() автор топика

(define (sqrt-iter guess x) 
    (if (good-enough? guess x) guess 
	(sqrt-iter (improve guess x) x))) 

(define (improve guess x) 
    (average guess (/ x guess))) 

(define (average x y) 
    (/ (+ x y) 2)) 

(define (good-enough? guess x) 
    (< (abs (- (square guess) 
	       x)) 
       0.001)) 

(define (sqrt x) 
    (sqrt-iter 1.0 x))
 
(define (square x) 
    (* x x))

А почему разметка выделывается? Почему не просто моноширинным шрифтом кажет?

psv1967 ★★★★★
()
Ответ на: комментарий от Slowbrozo

Ещё один вопрос. Теперь про [guess]. (define (sqrt-iter guess x)

(define (sqrt x) (sqrt-iter 1.0 x))

Точно guess никуда не было прицепленно, верно? Только в (define (sqrt x) (sqrt-iter 1.0 x)) так сделали для удобства, чтобы каждый раз не подставлять 1.0?

Кстати, сама формула. √x = такое y, что y ≥ 0 и y(в квадрате) = x

Slowbrozo
() автор топика
Ответ на: комментарий от Slowbrozo

>Точно guess никуда не было прицепленно, верно? Только в (define (sqrt x) (sqrt-iter 1.0 x)) так сделали для удобства, чтобы каждый раз не подставлять 1.0?

Распарсил с большим трудом. Выражайся понятнее.

(define (sqrt-iter guess x) ......skip) - это определение функции sqrt-iter, которая и реализует алгоритм, guess в данном случае - по сути начальная точка.

(define (sqrt x) (sqrt-iter 1.0 x)) - это функция для упрощения работы, эту точку взяли за 1.0.

У тебя какие-то странные вопросы - код тут вполне понятный, а вокруг кода в SICP ещё и слова написаны. Ты вдумчиво читаешь?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.