Я только начинаю работать через SICP (сам по себе, это не для класса), и я боролся с упражнением 1.6 на пару дней, и я просто не могу понять, что это вне. Это та, где Алисса переопределяет if
в терминах cond
, например:
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause))
Она успешно тестирует его в некоторых простых случаях, а затем использует его для повторной записи программы с квадратным корнем (которая отлично работает с if
):
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
Затем возникает вопрос: "Что происходит, когда Алисса пытается использовать это для вычисления квадратных корней? Объясните". [При необходимости, я рад воспроизвести другие процедуры (good-enough?
, improve
и т.д.), Просто дайте мне знать.]
Теперь я знаю, что происходит: он никогда не возвращает значение, а это означает, что программа бесконечно рекурсивно. Я просто не могу объяснить, почему это происходит. Какая бы ни была тонкая разница между if
и new-if
, ускользает от меня. Любая помощь очень ценится.