【发布时间】:2018-01-23 09:29:59
【问题描述】:
我最近开始接触递归。我浏览了一些可用的在线文档,但无法理解当我们使用不同的输入调用相同的方法时,递归调用是如何工作的。
假设,如果我见过树
return find(node.left) + find(node.right);
我无法理解它是如何工作的。
在一般递归中,每次调用都会在堆栈中占有一席之地,当达到基本条件时,我们计算并返回结果。 我试着做一个小程序,我从两个不同的调用者用不同的索引调用相同的方法,如果达到基本条件,则添加两个返回值。
if(n==0){
return arr[n];
}
else {
return calculateSum(arr, n-1) + arr[n];
}
代码运行良好。现在我继续前进并尝试了这样的事情。
它给了我堆栈溢出。
if(n==1){
return arr[n];
}
else {
return calculateSum(arr, n-1) + calculateSum(arr, n-2);
}
我完全无法理解它是如何发生的,我错过了这个主题以无法完全理解它。
我根据提供的建议更改了我的代码。但无法理解流程。 n-2 是如何运作的。我给了一些打印。请在下面找到打印和代码。
private static int calculateSum(int[] arr, int n, String caller){
if(n<=1){
System.out.println(caller+" : "+n+ " : "+arr[n]);
return arr[n];
}
else {
return calculateSum(arr, n-1," minus one") + calculateSum(arr, n-2,"minus two");
}
}
打印:
减一:1:2
减二:0:1
减二:1:2
减一:1:2
减二:0:1
减一:1:2
减二:0:1
减二:1:2
数组总和:13
如果有人可以帮助我了解它是如何工作的。我想知道 减二 值是如何在开始时变为 0,然后变为 1。为什么 减一 在减二后又被调用一次达到了基本条件。
注意:我已经删除了带有 return 语句的 arr[n]。所以,现在我想了解调用以及它是如何工作的。
【问题讨论】:
-
我想确认一下如果你改成
if (n <= 1)是否还会出现问题?我相信你在这里的递归实际上并没有结束。 -
@NelsonYeung:该更改将防止溢出,但现在可以尝试访问
arr[0]。 -
@ScottHunter 你为什么不想要
arr[0]?我以为你想要整个数组? -
@NelsonYeung:发布的代码(至少最终版本)不包含它。
-
发布了代码中发生的详细信息。请检查它可能对您有帮助
标签: algorithm recursion data-structures tree