理解使用Eclipse的Java递归';调试器
为了理解这个概念(我很难理解),我将在Java中进行一些简单的递归练习。到目前为止,我的所有研究都在很大程度上依赖于Eclipse的调试器,以便准确地理解我的代码在做什么。然而,当涉及到递归时,我发现情况并非如此,因为很难准确跟踪正在发生的事情 考虑到以下代码,返回理解使用Eclipse的Java递归';调试器,java,eclipse,debugging,recursion,Java,Eclipse,Debugging,Recursion,为了理解这个概念(我很难理解),我将在Java中进行一些简单的递归练习。到目前为止,我的所有研究都在很大程度上依赖于Eclipse的调试器,以便准确地理解我的代码在做什么。然而,当涉及到递归时,我发现情况并非如此,因为很难准确跟踪正在发生的事情 考虑到以下代码,返回nth Fibonacci数的方法: public int fibonacci(int n) { if (n == 0 || n == 1) { return n; } else { r
n
th Fibonacci数的方法:
public int fibonacci(int n) {
if (n == 0 || n == 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
当使用此代码的调试器时,很难准确跟踪正在发生的事情以及在何处/何时发生的事情。只有一个变量,它每一步都会改变,并且,如果有一个小的n
值,例如7,它已经变得很难跟踪,因为在最终达到13之前执行的步骤太多了
我想知道:
返回fibonacci(n-1)+fibonacci(n-2)
的概念很容易理解,我是否过于关注此类事情的调试您可以在打印
n
值及其fibonnacci
值的每个指令中使用简单的System.out.prinln()
对其进行调试
下面是一个示例代码:
public int fibonacci(int n) {
if (n == 0 || n == 1) {
System.out.println("your value is: " +n+ " and its Fibonacci value is: "+n);
return n;
} else {
System.out.println("your value is: " +n+ " and its Fibonacci value is: "+fibonacci(n - 1) + fibonacci(n - 2));
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
您可以测试我花了一段时间才掌握递归,出于这样或那样的原因,我从未发现调试器有用。我将尝试向您解释我是如何做的,并且它不涉及调试器(免责声明:这是一种个人方法,可能不正确或不通用)
返回n代码>->端接块
返回fibonacci(n-1)+fibonacci(n-2)代码>->递归块
Fn1
和Fn2
中。考虑砖墙:递归函数创建墙,将砖块添加到现有墙中。在递归块内部,在某一步,您不在乎是谁以及如何创建了现有墙,只需向其中添加一块新砖即可。然后,墙是由相同的功能创建的,一次一块砖n=1
或n=0
),我必须再次将这些数字加到总数中。这是由递归块完成的。换句话说,终止块向递归块提供具体的值(而不是如何获得它们的过程)Input value: 4
Recursion block value: fibonacci(3) + fibonacci(2)
Input value: 3
Recursion block value: fibonacci(2) + fibonacci(1)
Input value: 2
Recursion block value: fibonacci(1) + fibonacci(0)
Input value: 1
Terminating block value: 1
Input value: 0
Terminating block value: 0
Recursion block return value: 1
Input value: 1
Terminating block value: 1
Recursion block return value: 2
Input value: 2
Recursion block value: fibonacci(1) + fibonacci(0)
Input value: 1
Terminating block value: 1
Input value: 0
Terminating block value: 0
Recursion block return value: 1
Recursion block return value: 3
您还可以阅读一些有用的内容,这些内容与递归密切相关。如何调试递归代码?
首先,确保已切换到“调试”透视图,并且看到了正确的窗口(变量
、表达式
、调试
和源代码),例如:
接下来,请注意,在Debug
中,您可以看到当前调用该方法的频率。此列表将根据调用了多少方法以及尚未返回多少方法而增减
您可以单击其中一个方法来更改范围。查看更改范围时变量的内容如何更改
最后,要检查任意内容,请在expressions
窗口中输入表达式。这几乎就像是实时编码。你几乎可以检查任何东西
我是否过于关注调试?
不。学会正确地做这件事,以后会节省你很多时间
添加一个System.out.println()
需要重新编译,您需要重现并不总是那么简单的情况。内联代码使得使用Eclipse调试器更加困难,因为它非常注重显示不存在的局部变量。通过使事情更加详细并保存到变量中,可以更容易地逐步完成。通过这种方式,您可以更容易地看到正在发生的事情和结果。例如,按以下方式修改代码将使在上使用调试器更容易:
public int fibonacci(int n) {
if (n == 0 || n == 1) {
return n;
} else {
int nMinus1 = fibonacci(n - 1);
int nMinus2 = fibonacci(n - 2);
int retValue = nMinus1 + nMinus2;
return retValue;
}
}
免责声明:我没有尝试编译此代码。您是否尝试在一张纸上绘制调用结构?这可能是理解递归正在做什么的一个很好的练习IMHO@RC:请不要通过打印到系统输出来教他进行调试。我知道有太多的开发人员正是这样做的,这通常会使其成为生产代码。++用于尝试理解递归和调试器。您可能需要仔细查看调用堆栈。Eclipse允许您选择堆栈框架并查看该堆栈框架中的变量值。这有助于理解递归。
public int fibonacci(int n) {
if (n == 0 || n == 1) {
return n;
} else {
int nMinus1 = fibonacci(n - 1);
int nMinus2 = fibonacci(n - 2);
int retValue = nMinus1 + nMinus2;
return retValue;
}
}