递归函数是一个自行调用的函数
它允许程序员使用最少的代码编写高效的程序。
缺点是,如果编写不正确,它们可能会导致无限循环和其他意外结果。
我将解释简单递归函数和尾递归函数
为了编写一个简单的递归函数
- 要考虑的第一点是何时应该决定退出循环,即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的结果