RECURSE — 재귀 호출
RECURSE — 재귀 호출
RECURSE는 현재 정의가 실행될 때 그 정의를 실행하도록 하는 코어 단어예요.
본문
컴파일 (Compilation)
( -- )
현재 정의의 실행 의미를 현재 정의에 추가해요. RECURSE가 DOES> 뒤의 정의에 나타나면 애매한 조건이 존재해요.
참조 (See)
- 6.1.1250 DOES>
- A.6.1.2120 RECURSE
합리성 (Rationale)
전형적인 사용:
: X ... RECURSE ... ;
이것은 Forth의 재귀 연산자예요. 일부 구현에서는 MYSELF라고 불러요. 전형적인 예는 팩토리얼 함수의 코딩이에요.
: FACTORIAL ( +n1 -- +n2)
DUP 2 < IF
DROP 1 EXIT
THEN
DUP 1- RECURSE *
;
*n2 = n1(n1-1)(n1-2)...(2)(1)*, 즉 n1에 자기보다 작은 모든 양의 정수를 곱한 곱이에요 (특별한 경우로, 0 팩토리얼은 1과 같아요). 컴퓨터 과학자들이 사랑하지만, 재귀는 이식 가능한 값 표현에서 큰 결과를 생성함에 따라 어셈블리 언어 및 네이티브 코드 시스템에서 추적하기 어려운 많은 양의 저장을 만들 수 있어요.
테스트 (Testing)
T{ : GI6 ( N -- 0,1,..N )
DUP IF DUP >R 1- RECURSE R>
THEN ; -> }T
T{ 0 GI6 -> 0 }T
T{ 1 GI6 -> 0 1 }T
T{ 2 GI6 -> 0 1 2 }T
T{ 3 GI6 -> 0 1 2 3 }T
T{ 4 GI6 -> 0 1 2 3 4 }T
T{ :NONAME ( n -- 0, 1, .., n )
DUP IF DUP >R 1- RECURSE R> THEN
;
CONSTANT rn1 -> }T
T{ 0 rn1 EXECUTE -> 0 }T
T{ 4 rn1 EXECUTE -> 0 1 2 3 4 }T
T{ DECIMAL }T
T{ :NONAME ( n -- n1 )
1- DUP
CASE 0 OF EXIT ENDOF
1 OF 11 SWAP RECURSE ENDOF
2 OF 22 SWAP RECURSE ENDOF
3 OF 33 SWAP RECURSE ENDOF
DROP ABS RECURSE EXIT
ENDCASE
; CONSTANT rn2 -> }T
T{ 1 rn2 EXECUTE -> 0 }T
T{ 2 rn2 EXECUTE -> 11 0 }T
T{ 4 rn2 EXECUTE -> 33 22 11 0 }T
T{ 25 rn2 EXECUTE -> 33 22 11 0 }T