Java 无法理解为什么每个递归调用都添加1
我一直在进行一项代码挑战,要求将数字的位数不断相乘,直到位数减少到一个位数,然后返回乘法发生的次数。如果传入的参数是一位数字,则该方法必须返回0 我已经使用循环解决了这个问题,但我想了解如何使用递归。下面是我发现的代码,除了为什么每次调用都添加1之外,我大部分都能理解?有人能帮我理解吗?谢谢Java 无法理解为什么每个递归调用都添加1,java,recursion,Java,Recursion,我一直在进行一项代码挑战,要求将数字的位数不断相乘,直到位数减少到一个位数,然后返回乘法发生的次数。如果传入的参数是一位数字,则该方法必须返回0 我已经使用循环解决了这个问题,但我想了解如何使用递归。下面是我发现的代码,除了为什么每次调用都添加1之外,我大部分都能理解?有人能帮我理解吗?谢谢 公共静态int持久性(int num){ int mul=1; 如果(num
公共静态int持久性(int num){
int mul=1;
如果(num<10)返回0;
while(num!=0){
mul*=num%10;
num/=10;
}
返回1+持久性(mul);//调用1+方法的原因?
}
persistence(39)//应该返回3
persistence(999)//应返回4
持久性(4)//应返回0
// 39: 3 * 9 = 27, 2 * 7 = 14, 1 * 4 = 4. 返回值3
// 4: 4 * 1 = 4. 返回的值为0
每次调用该方法时,它将返回1+下一次方法调用的结果。基本上,它是计算需要经过多少次,然后乘以这些数字。下面是一个(简化的)可视化视图,显示每次返回的内容:
persistence(39) -> 1 + persistence(27)
1 + (persistence(27)) -> 1 + (1 + persistence(14)) -> 2 + persistence(14)
2 + (persistence(14)) -> 2 + (1 + persistence(4)) -> 3 + persistence(4)
3 + (persistence(4)) -> 3 + (0) -> 3
每次调用该方法时,它将返回1+下一次方法调用的结果。基本上,它是计算需要经过多少次,然后乘以这些数字。下面是一个(简化的)可视化视图,显示每次返回的内容:
persistence(39) -> 1 + persistence(27)
1 + (persistence(27)) -> 1 + (1 + persistence(14)) -> 2 + persistence(14)
2 + (persistence(14)) -> 2 + (1 + persistence(4)) -> 3 + persistence(4)
3 + (persistence(4)) -> 3 + (0) -> 3
嗯。。学习递归时也会出现类似的问题!每一位工程师所走的道路。让我们把
1
放在一个变量中,而持久性(mul)
是另一个变量。就是
int oneStepResult = persistence(mul); // watch out that the rest of the line is evaluated when returned 0, that is, base case
int isDone = 1;
return oneStepResult + isDone;
试着这样想。作为建议,当您在回答“递归做什么”的问题时遇到困难时,请尝试剖析它的方法体
34岁
39岁
是的。。学习递归时也会出现类似的问题!每一位工程师所走的道路。让我们把
1
放在一个变量中,而持久性(mul)
是另一个变量。就是
int oneStepResult = persistence(mul); // watch out that the rest of the line is evaluated when returned 0, that is, base case
int isDone = 1;
return oneStepResult + isDone;
试着这样想。作为建议,当您在回答“递归做什么”的问题时遇到困难时,请尝试剖析它的方法体
34岁
39岁
是的,使用变量并将其分解确实有帮助。我只是想确认一下我是否理解正确。变量
oneStepResult
总是指向0,因为persistense(mul)
没有返回任何值,它只是返回自己,所以在不向其添加1的情况下,oneStepResult
总是指向0,这就是为什么使用1的原因。@KabirGandhiok变量oneStepResult总是指向0
是不正确的。我会在这里添加一张图片,让您更好地理解。我会在这里添加一张图片,让您更好地理解
,谢谢@如果它们看起来太快了,你可以通过上传到url,每帧看到它们,啊,好的,我想我现在明白了。例如,对于persistence(39)
,只要mul
为10或更大,以persistence(27)
开头的每个调用都会随着递归的进行和while循环的继续而添加到调用堆栈中,从而减少mul
的值。然后,只要mul
减少到4,persistence(4)
就成为要添加到堆栈的最后一个调用,然后堆栈返回0(退出值)+1。然后堆栈中剩余的调用,1+persistence(14)和1+persistence(27)
被清空,1+1表示14,2+1表示27。希望我现在就知道了?是的,使用变量并将其分解确实有帮助。我只是想确认一下我是否理解正确。变量oneStepResult
总是指向0,因为persistense(mul)
没有返回任何值,它只是返回自己,所以在不向其添加1的情况下,oneStepResult
总是指向0,这就是为什么使用1的原因。@KabirGandhiok变量oneStepResult总是指向0
是不正确的。我会在这里添加一张图片,让您更好地理解。我会在这里添加一张图片,让您更好地理解
,谢谢@如果它们看起来太快了,你可以通过上传到url,每帧看到它们,啊,好的,我想我现在明白了。例如,对于persistence(39)
,只要mul
为10或更大,以persistence(27)
开头的每个调用都会随着递归的进行和while循环的继续而添加到调用堆栈中,从而减少mul
的值。然后,只要mul
减少到4,persistence(4)
就成为要添加到堆栈的最后一个调用,然后堆栈返回0(退出值)+1。然后堆栈中剩余的调用,1+persistence(14)和1+persistence(27)
被清空,1+1表示14,2+1表示27。希望我现在就拿到了?