2013-02-24 33 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)) 

在第二行沒有主體。