【发布时间】:2017-01-13 17:33:28
【问题描述】:
我在 LeetCode 上遇到了一个问题,需要复习一下递归。这是问题:
Given a non-negative integer num, repeatedly add all its digits until
the result has only one digit.
For example:
Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit,
return it.
我已经看到了使用 while 循环的答案,但我想尝试使用递归。 这是我目前所拥有的:
public int AddDigits(int num) {
if(num > 9)
{
num = (num%10) + (num/10);
AddDigits(num);
}
else{
return num;
}
}
首先,我得到"Not all code paths return a value.",但基于if 布尔检查,这不应该吗?即使我在 else 块之后添加return num,我仍然得到 11。使用 29 的输入,我的解决方案返回 11,即使 num最终变为 2。使用上面的递归解决方案,return num 部分出现几次(我用 Console.WriteLine 语句进行了测试) - 这是由于堆栈吗?
这是我想知道的 - 为什么代码会在递归调用之后出现 - 或者递归调用通常不应该包含递归调用之后的代码?
另外,如何在不使用 while 循环的情况下使用递归?
【问题讨论】:
-
return AddDigits(num); -
“为什么在递归调用之后会出现代码 - 或者递归调用通常不应该包含递归调用之后的代码?”在此处查找术语“尾递归”以找到答案。