2013-02-24 2 views
1

영감을받은 this 게시물. 그것은 내 시험 각 기능은 내가 잘못했다 그래서 여기에 "몸"을 가지고함으로써 r5rs:body: no expression in body in: (r5rs:body)스킴 - 중첩 람다가있는 fibonacci 시리즈

을 묻는 것

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

-

나는 중첩 된 람다와 피보나치 시리즈를 구현하려고? 내가 여기서 뭘하려고 구현은 이전 시리즈를 재 - 계산하지 않도록 반복 모드가 있음을

주 ..

편집 :

도 작동 다른 모드 -

(((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'는 아마도 도움이되지 않습니다. –

+0

그것은 단지 오타였습니다. 여전히 같은 오류 – URL87

답변

1

을 음, 이것은 입니다. 피보나치를 계산하는 고안된 방법이지만 그럼에도 불구하고 가능합니다 :

당신이 가변 인자로 익명의 재귀 프로 시저를 작성할 수 있으며,이로

(define (Y X) 
    ((lambda (proc) (proc proc)) 
    (lambda (proc) 
    (X (lambda args 
      (apply (proc proc) args)))))) 

: 당신이 define를 사용하지 않고 재귀 함수를 작성하기위한 일반적인 방법을 목표로하는 경우

(((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-Combinator를 구현 예를 들어 두 번째 라인

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

+0

@ URL87 이는 _anonymous_ 재귀 호출이며,이 태그가 없으면 "반복"되지 않습니다. 그래서 예, 거기에 가야합니다. –

1
(lambda (fibo-gen)) 

에는 본체가 없다.