Scheme - 具有嵌套lambda的fibonacci系列

时间:2013-02-24 23:08:16

标签: functional-programming scheme fibonacci y-combinator

受到启发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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

(lambda (fibo-gen))

在第二行没有身体。