2013-02-24 3 views
1

Вдохновленный this пост.Scheme - серия фибоначчи с вложенной лямбдой

Я пытаюсь реализовать ряд Фибоначчи с вложенным лямбда -

(((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)

По моей экспертизе каждая функция имеет «тело» здесь, так что я сделал не так?

Обратите внимание, что реализация я пытаюсь сделать здесь является итеративным режим, который избежать повторного вычисления предыдущей серии ..

Edit:

Другой режим, который также работает -

(((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 
+0

'lamba', вероятно, не поможет. –

+0

Это была только опечатка .. все та же ошибка – URL87

ответ

1

Ну, это довольно - изобретательный способ расчета фибоначчи, но тем не менее возможно:

(((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 
+0

Нужно ли здесь (fib-gen fib-gen)? Почему бы просто включить 'N' каждую итерацию, как я пробовал? – URL87

+0

@ URL87 это речевой вызов _anonymous_, без него не будет никакой «итерации». Так что да, он должен туда идти. –

1
(lambda (fibo-gen)) 

во второй строке не имеет тела.

 Смежные вопросы

  • Нет связанных вопросов^_^