재귀 함수는 자체적으로 호출 하는 함수입니다.
이를 통해 프로그래머는 최소한의 코드를 사용하여 효율적인 프로그램을 작성할 수 있습니다 .
단점은 적절하게 작성하지 않으면 무한 루프 및 기타 예기치 않은 결과 가 발생할 수 있다는 것 입니다.
Simple Recursive 함수와 Tail Recursive 함수를 모두 설명하겠습니다.
단순 재귀 함수 를 작성하려면
- 고려해야 할 첫 번째 사항은 if 루프 인 루프에서 나올 때를 결정할 때입니다.
- 두 번째는 우리가 우리 자신의 기능인 경우해야 할 과정입니다.
주어진 예에서 :
public static int fact(int n){
if(n <=1)
return 1;
else
return n * fact(n-1);
}
위의 예에서
if(n <=1)
return 1;
루프를 종료 할시기를 결정하는 요소입니다.
else
return n * fact(n-1);
수행 할 실제 처리입니까?
쉽게 이해할 수 있도록 작업을 하나씩 나누겠습니다.
내가 실행하면 내부적으로 어떤 일이 일어나는지 보자 fact(4)
- n = 4 대체
public static int fact(4){
if(4 <=1)
return 1;
else
return 4 * fact(4-1);
}
If
루프가 실패하여 else
루프 로 이동하여 반환합니다.4 * fact(3)
스택 메모리에는 4 * fact(3)
n = 3 대체
public static int fact(3){
if(3 <=1)
return 1;
else
return 3 * fact(3-1);
}
If
루프가 실패하여 else
루프 로 이동 합니다.
그래서 그것은 반환 3 * fact(2)
```4 * fact (3)``라고 불렀다는 것을 기억하십시오.
출력 fact(3) = 3 * fact(2)
지금까지 스택은 4 * fact(3) = 4 * 3 * fact(2)
스택 메모리에는 4 * 3 * fact(2)
n = 2 대체
public static int fact(2){
if(2 <=1)
return 1;
else
return 2 * fact(2-1);
}
If
루프가 실패하여 else
루프 로 이동 합니다.
그래서 그것은 반환 2 * fact(1)
우리가 전화했던 기억 4 * 3 * fact(2)
출력 fact(2) = 2 * fact(1)
지금까지 스택은 4 * 3 * fact(2) = 4 * 3 * 2 * fact(1)
스택 메모리에는 4 * 3 * 2 * fact(1)
n = 1 대체
public static int fact(1){
if(1 <=1)
return 1;
else
return 1 * fact(1-1);
}
If
루프가 참
그래서 그것은 반환 1
우리가 전화했던 기억 4 * 3 * 2 * fact(1)
출력 fact(1) = 1
지금까지 스택은 4 * 3 * 2 * fact(1) = 4 * 3 * 2 * 1
마지막으로 fact (4) = 4 * 3 * 2 * 1 = 24의 결과
꼬리 재귀는 것
public static int fact(x, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(x-1, running_total*x);
}
}
- n = 4 대체
public static int fact(4, running_total=1) {
if (x==1) {
return running_total;
} else {
return fact(4-1, running_total*4);
}
}
If
루프가 실패하여 else
루프 로 이동하여 반환합니다.fact(3, 4)
스택 메모리에는 fact(3, 4)
n = 3 대체
public static int fact(3, running_total=4) {
if (x==1) {
return running_total;
} else {
return fact(3-1, 4*3);
}
}
If
루프가 실패하여 else
루프 로 이동 합니다.
그래서 그것은 반환 fact(2, 12)
스택 메모리에는 fact(2, 12)
n = 2 대체
public static int fact(2, running_total=12) {
if (x==1) {
return running_total;
} else {
return fact(2-1, 12*2);
}
}
If
루프가 실패하여 else
루프 로 이동 합니다.
그래서 그것은 반환 fact(1, 24)
스택 메모리에는 fact(1, 24)
n = 1 대체
public static int fact(1, running_total=24) {
if (x==1) {
return running_total;
} else {
return fact(1-1, 24*1);
}
}
If
루프가 참
그래서 그것은 반환 running_total
출력 running_total = 24
마지막으로 fact (4,1) = 24 의 결과