Рекурсивные процедуры без letrec
Как ни удивительно, интуитивная догадка Хьюго (в упражнении 4.20
) оказывается верной. Действительно, можно строить рекурсивные процедуры без использования
letrec
(и даже без
define
), только способ это сделать намного тоньше, чем казалось Хьюго. Следующее выражение вычисляет факториал
10
с помощью рекурсивной процедуры:
((lambda (n)
((lambda (fact)
(fact fact n))
(lambda (ft k)
(if (= k 1)
1
(* k (ft ft (- k 1)))))))
10)
а. Проверьте, что это выражение на самом деле считает факториалы (вычисляя его). Постройте аналогичное выражение для вычисления чисел Фибоначчи.
б. Рассмотрим следующую процедуру, включающую взаимно рекурсивные внутренние определения:
(define (f x)
(define (even? n)
(if (= n 0)
true
(odd? (- n 1))))
(define (odd? n)
(if (= n 0)
false
(even? (- n 1))))
(even? x))
Восстановите пропущенные фрагменты так, чтобы получилось альтернативное определение
f
, где нет ни внутренних определений, ни
letrec
:
(define (f x)
((lambda (even? odd?)
(even? even? odd? x))
(lambda (ev? od? n)
(if (= n 0) true (od? ?? ?? ??)))
(lambda (ev? od? n)
(if (= n 0) false (ev? ?? ?? ??)))))
Комментарии отсутствуют.