Java 无法理解为什么每个递归调用都添加1

Java 无法理解为什么每个递归调用都添加1,java,recursion,Java,Recursion,我一直在进行一项代码挑战,要求将数字的位数不断相乘,直到位数减少到一个位数,然后返回乘法发生的次数。如果传入的参数是一位数字,则该方法必须返回0 我已经使用循环解决了这个问题,但我想了解如何使用递归。下面是我发现的代码,除了为什么每次调用都添加1之外,我大部分都能理解?有人能帮我理解吗?谢谢 公共静态int持久性(int num){ int mul=1; 如果(num

我一直在进行一项代码挑战,要求将数字的位数不断相乘,直到位数减少到一个位数,然后返回乘法发生的次数。如果传入的参数是一位数字,则该方法必须返回0

我已经使用循环解决了这个问题,但我想了解如何使用递归。下面是我发现的代码,除了为什么每次调用都添加1之外,我大部分都能理解?有人能帮我理解吗?谢谢

公共静态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。希望我现在就拿到了?