2013-02-24 49 views
1

启发this后。计划 - 斐波纳契系列与嵌套lambda

我想实现一个斐波那契数列与嵌套拉姆达 -

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

'lamba'可能没有帮助。 – 2013-02-24 23:18:25

+0

这只是错字..还是一样的错误 – URL87 2013-02-24 23:22:44

回答

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 2013-02-24 23:42:17

+0

@ URL87这是_anonymous_递归调用,没有它将不会有任何“迭代”。所以是的,它必须去那里。 – 2013-02-24 23:43:10

1
(lambda (fibo-gen)) 

在第二行没有主体。