2013-04-24 4 views
0

나 자신에 의해 계획을 공부하고 최근이 코드가 발생했습니다 :이 코드의 재귀는 어디에 있습니까?

((lambda (gcd) (gcd (12 8 gcd)) 
    (lambda(a b gcdnew) 
     (if (= b 0) 
     a 
     (gcdnew b (modulo a b) gcdnew)))) 

저자는이 하나의 재귀가 말했다. 나는 그에게 연락 할 수 없었던 오래된 주제였다. 그럼 어디에서 (재귀)입니까?

(gcdnew 8 4 gcdnew) 

음, 'gcdnew'에서 매개 변수로 'gcdnew'의 포인트를 무엇 : 우리의 몸이 실제로 그래서 두 번째 '람다'값에 첫 번째 'GCD'를가는 것 같다? 도와 주셔서 감사합니다.

+1

(사실 당신도 재귀 적으로 정의 할 필요가 없습니다). 실제로, gcdnew 여분 논증은 그것을 가능하게하는 것입니다. –

답변

2

gcdnew의 요점은 재귀 호출에 사용할 함수를 보유한다는 것입니다.

외부 람다 함수 (gcd)을 취하고 (12) (8)에 적용하고, 또한 전달하여 재귀 설정 같은 그 세번째 파라미터로서 기능.
내부 함수 내부에서 gcdnew은 내부 함수 자체를 참조하며 gcdnew을 사용하여 재귀 적으로 호출하며 재귀에서 함께 전달합니다 (즉, 자체).

은 BTW : 당신은 너무 많은 브라켓을 가지고 있다는 점에서 약간의 오타가있다 - 아마

((lambda (gcd) (gcd 12 8 gcd)) 
    (lambda (a b gcdnew) 
    (if (= b 0) 
      a 
     (gcdnew b (modulo a b) gcdnew)))) 
+0

감사합니다. 알았다. 나는 그것이 어떻게 작동하는지 이해하기 위해이 일을했다 : 는 (AMA (람다 (AB를 gcdnew) 를 (정의하면 (= B 0) (gcdnew의 B (모듈 AB) gcdnew)))) 다음 나는 이것을했다 : (ama 12 8 ama) 그것은 내가 재귀를 더 잘 이해하는 것을 허락했다. – Aladin

0

이는 Y의 콤비로 알려져 있어야한다.

실제로 명시 적 재귀를 지원하지 않는 언어로 재귀를 수행 할 수 있습니다. 그것은 letrec 사용하지 않고 재귀를 할 수있는 우회 방법

http://mvanier.livejournal.com/2700.html

관련 문제