int n
将是n = 4
所以在我的头脑和纸上我一步一步地认为我的结果如下:
返回0
有人可以告诉我为什么不是这样吗?并指导我完成递归步骤?
public static void main(String[] args) {
Scanner kbd = new Scanner(System.in);
int n;
System.out.println("Enter a number: ");
n = kbd.nextInt();
System.out.println("recursive value "+intValue(n));
}
public static int intValue(int n)
{
int total;
int x;
if(n == 0)
return 0;
else
total = n * n + intValue(n-1);
System.out.println("Recursive total: "+total);
return total;
}
答案 0 :(得分:1)
以下是递归步骤,从n
4
开始:
intValue(4)
n is not 0. total is 4 * 4 + intValue(3)
intValue(3)
n is not 0. total is 3 * 3 + intValue(2)
intValue(2)
n is not 0. total is 2 * 2 + intValue(1)
intValue(1)
n is not 0. total is 1 * 1 + intValue(0)
intValue(0)
n is 0, intValue(0) returns 0.
1 * 1 + 0 = 1.
Print Recursive value: 1, intValue(1) returns 1.
2 * 2 + 1 = 5.
Print Recursive value: 5, intValue(2) returns 5.
3 * 3 + 5 = 14.
Print Recursive value: 14, intValue(3) returns 14.
4 * 4 + 14 = 30.
Print Recursive value: 30, intValue(4) returns 30.
回到main,初始调用返回30
,然后打印recursive value 30
。
递归调用不会返回n - 1
本身来添加;它会返回以intValue
作为参数再次调用n - 1
的结果。
答案 1 :(得分:0)
所以你的递归方程是
total = n * n + intValue(n-1);
当你用4运行它时,它就是
4 * 4 + intValue(3)
在这种情况下 intValue(3)是
3 * 3 + intValue(2)
在这种情况下 intValue(2)是
2 * 2 + intValue(1)
在这种情况下 intValue(1)是
1 * 1 + intValue(0)
在这种情况下 intValue(0)是
0
在这种情况下返回, intValue(1)是
1 * 1 + intValue(0) = 1*1 + 0 = 1;
在这种情况下返回, intValue(2)是
2 * 2 + intValue(1) = 2 * 2 + 1 = 5
在这种情况下 intValue(3)是
3 * 3 + intValue(2) = 3 * 3 + 5 = 14
在这种情况下 intValue(4)是
4 * 4 + intValue(3) = 4 * 4 + 14 = 30
答案 2 :(得分:0)
关于递归的事情是它一直调用自己,直到它到达n == 0返回的点。你试图在纸上解决问题的方式是颠倒的。
在n == 0之前,它不会评估你的等式,并且所有递归调用基本上都是堆叠等待结果。所以它得到了这样的结果,(括号中的每个op都在等待递归调用的结果):
总计= 4 * 4 +(3 * 3 +(2 * 2 +(1 * 1 + 0))) 评估 5.(堆栈顶部),n = 0,返回0