简单的递归示例 – 请帮助我理解递归
public static int triple(int n) { if (n == 0) return 0; else total = 3 + triple(n-1); System.out.println(total); return total; }
好的,所以我有一个简单的回忆示例,我似乎无法掌握,我希望有人能够让我逐步了解程序如何获得其输出。
这就是我认为会发生的事情。 让我们说n=5
所以,程序循环和命中total = 3 + triple(5-1)
,我认为这将等于7 ..这是错误的程序打印
3
6
9
12
15
所以…然后我认为三重必须在打印总数之前再次运行……我相信它确实如此但我根本不明白它的总和是怎么回事。
因为它看起来像这样:
3 + triple(4) 3 + triple(3) 3 + triple(2) 3 + triple(1) =3
有人可以解释一下,因为你我可以很失落!
你解释它有点不对劲。 它更像是这样的:
三(5)= 3 +三(4) 三(4)= 3 +三(3) 三(3)= 3 +三(2) 三(2)= 3 +三(1) 三(1)= 3 +三(0) 三(0)= 0
现在想象triple(0)
, triple(1)
等都是个体变量,并通过逐步解决triple(5)
。
所以它不会一直工作到零(通过减1)然后再加3(0 3 6等)。
这是我得到的输出:
n:5 n:4 n:3 n:2 n:1 n:0 total:3 total:6 total:9 total:12 total:15
它正在做的是从每个枚举中减去一个,然后在现在的0-5中加3
您的输出应如下所示:
3 = triple(1) = 3+triple(0) 6 = triple(2) = 3+triple(1) 9 = triple(3) = 3+triple(2) 12 = triple(4) = 3+triple(3) 15 = triple(5) = 3+triple(4)
这是因为triple(n)会在打印出消息之前调用triple(n-1)。 因此,您的三(5)条消息将最后打印出来。
当执行到达该点时,三重方法从开始再次开始执行。 一旦它返回,执行将在下一行继续。 这是递归发生的。
所以执行顺序如下:
- if(n == 0)// n == 5此时,条件为假
- 总= 3 +三(n-1)//我们必须计算三(4)
- if(n == 0)// n == 4 now。
- 总= 3 +三(n-1)//我们必须计算三(3)
- …等,直到n == 0:
- if(n == 0)//真!
- return 0 //返回0
- total = 3 + 0 // 0来自triple(n-1),它刚刚返回0
- 的System.out.println(总); //打印3
- 返回总数; //返回3
- 总数= 3 + 3; //再来3来自三联(n-1),其中n == 2
- 的System.out.println(总); //这次打印6
- … 等等。
请注意,定义的函数只是将输入乘以3,并在每个倍数处打印结果。
public static int triple(int n) { if (n == 0) return 0; else return 3 + triple(n-1); System.out.println(return); }
忽略println(返回)只是为了理解目的。 这就是我如何分解它以最终掌握递归函数/方法。
triple(3) return 3 + triple(3-1)_is_6<---- (return = 9)<-- println(return) triple(2) return 3 + triple(2-1)_is_3<-- (return = 6)<---- println(return); triple(1) return 3 + triple(1-1)_is_0<---- (return = 3)<-- println(return) triple(0) return 0; is 0 (return = 0)<---- (no println for n==0)
谢谢大家帮忙理解这一点。 我没做的就是记住每个三元组(n-1)返回自己的值,然后将其计算到它上面的调用中。
再次感谢!
triple(0) = 0 triple(1) = 3 + triple(0) ie 3+0=3 triple(2) = 3 + triple(1) ie 3+3=6 triple(3) = 3 + triple(2) ie 3+6=9 triple(4) = 3 + triple(3) ie 3+9=12 triple(5) = 3 + triple(4) ie 3+12=15