Схема - ряд Фибоначчи с вложенной лямбдой
Вдохновил этот пост.
Я пытаюсь реализовать ряд Фибоначчи с вложенной лямбда -
(( (lambda (x) (x x)) ;; evaluate x on x
((lambda (fibo-gen)) ;; fibo-gen get another func as arg
(lambda (N it second first)
(cond ;; here the body of the above func ..
((= N 1) 1)
((= N 1) 1)
((= N it) (+ second first))
(else (fibo-gen (+ it 1) (+ second first) (second)))
)
)
)
)
5 1 1 1)
Это подсказки r5rs:body: no expression in body in: (r5rs:body)
По моим наблюдениям, каждая функция имеет здесь "тело", так что я сделал не так?
Обратите внимание, что реализация, которую я пытаюсь сделать здесь, является итеративным режимом, который позволяет избежать пересчета предыдущих рядов.
Редактировать:
Еще один режим, который также работает -
(( (lambda (x) (x x)) ;; evaluate x on x
(lambda (fibo-gen) ;; fibo-gen body use another lambda ..
(lambda (N it second first)
(cond ;; here the body of the above func ..
((= N 1) 1)
((= N 2) 1)
((= N it) second)
(else ((fibo-gen fibo-gen) N (+ it 1) (+ second first) second))
)
)
)
)
5 1 1 1)
=> 8
2 ответа
Решение
Ну, это довольно надуманный способ вычисления фибоначчи, но тем не менее возможный:
(((lambda (x) (x x))
(lambda (fib-gen)
(lambda (it second first)
(if (zero? it)
first
((fib-gen fib-gen) (sub1 it) (+ first second) second)))))
10 1 0) ; here n = 10
=> 55
Если вы нацелены на общий способ написания рекурсивной функции без использования define
, сначала внедрите Y-Combinator:
(define (Y X)
((lambda (proc) (proc proc))
(lambda (proc)
(X (lambda args
(apply (proc proc) args))))))
При этом вы можете писать анонимные рекурсивные процедуры с переменным числом аргументов, например:
((Y
(lambda (fib-gen)
(lambda (it second first)
(if (zero? it)
first
(fib-gen (sub1 it) (+ first second) second)))))
10 1 0) ; here n = 10
=> 55