내가 변환하는 일반적인 방법을 발견 한 것 같습니다 어떤 꼬리 재귀에 재귀 절차를 :
- 추가 "result"매개 변수를 사용하여 헬퍼 서브 프로 시저를 정의하십시오.
- 프로 시저의 리턴 값에 적용될 항목을 해당 매개 변수에 적용하십시오.
- 시작하려면이 도우미 절차를 호출하십시오. "result"매개 변수의 초기 값은 재귀 프로세스의 종료점에 대한 값이므로 재귀 프로세스가 축소되기 시작하는 위치에서 결과 반복 프로세스가 시작됩니다.
예를 들어, 변환 할 원래 재귀 프로시 저는 다음과 같습니다 ( SICP 연습 1.17 ).
(define (fast-multiply a b)
(define (double num)
(* num 2))
(define (half num)
(/ num 2))
(cond ((= b 0) 0)
((even? b) (double (fast-multiply a (half b))))
(else (+ (fast-multiply a (- b 1)) a))))
다음은 변환 된 꼬리 재귀 프로 시저입니다 ( SICP 연습 1.18 ).
(define (fast-multiply a b)
(define (double n)
(* n 2))
(define (half n)
(/ n 2))
(define (multi-iter a b product)
(cond ((= b 0) product)
((even? b) (multi-iter a (half b) (double product)))
(else (multi-iter a (- b 1) (+ product a)))))
(multi-iter a b 0))
누군가 이것을 증명하거나 반증 할 수 있습니까?
b
2의 거듭 제곱을 선택하면 처음 product
에 0으로 설정 하는 것이 옳지 않다는 것을 알 수 있습니다. 그러나 b
홀수 일 때는 1로 변경해도 작동하지 않습니다 . 어쩌면 두 개의 다른 누산기 매개 변수가 필요할까요?