Functional programming 带嵌套lambda的fibonacci级数格式

Functional programming 带嵌套lambda的fibonacci级数格式,functional-programming,scheme,fibonacci,y-combinator,Functional Programming,Scheme,Fibonacci,Y Combinator,受启发的帖子 我试图实现一个带有嵌套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

受启发的帖子

我试图实现一个带有嵌套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:body中没有表达式:(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
这是计算斐波那契的一种非常人为的方法,但仍然有可能:

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

第二行没有正文。

lamba
可能没有帮助。只是打字错误。。还是同样的错误
(fib gen fib gen)
必须在这里吗?为什么不像我尝试的那样,在每次迭代中加入
N
?@URL87这是匿名递归调用,没有它就不会有任何“迭代”。所以是的,它必须去那里。
((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
(lambda (fibo-gen))