1

この投稿に影響を与えました。

ネストされたラムダでフィボナッチ数列を実装しようとしています-

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

2 に答える 2

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

を使用せずに再帰関数を作成する一般的な方法を目指している場合は、最初にY-Combinatordefineを実装します。

(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
于 2013-02-24T23:26:59.417 に答える
1
(lambda (fibo-gen))

2行目には本体がありません。

于 2013-02-24T23:35:31.623 に答える