我正在编写一个函数,它应该使用递归来获取整数中的位数,例如: 236有3位数。到目前为止,我有这个,但它不起作用。那么,那里的递归有一个非常好的解释吗?
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(getDigits(5428, 0));
Console.ReadLine();
}
public static int getDigits(int digits, int i)
{
if (digits != 0)
{
i++;
getDigits(digits/10, i);
}
return i;
}
}
}
答案 0 :(得分:5)
好吧,你需要稍微调整一下递归函数:
public static int GetDigits(int number, int digits)
{
if (number == 0)
return digits;
return GetDigits(number / 10, ++digits);
}
你的错误是,你没有从递归电话中返回结果。
答案 1 :(得分:0)
您正在返回i
,但当函数从递归返回时,i
的值为1,则返回1.
您必须返回递归的结果。
return getDigits(...)
public static int getDigits(int digits, int i)
{
if (digits != 0)
{
i++;
getDigits(digits/10, i);
}
return i;
}
步骤1:
digits = 5428
i = 0
步骤2:
digits = 542
i = 1
[...]您递增i
,但是您没有返回递归的结果,而是在步骤#1返回i
的值。
现在,如果你喜欢这样:
public static int GetDigits(int number, int digits)
{
if (number == 0)
{
return digits == 0 ? 1 : digits;
}
return GetDigits(number / 10, ++digits);
}
您将从递归中返回值。
步骤1:
number = 5428
digits = 0
步骤2:
number = 542
digits = 1
第3步:
number = 54
digits = 2
步骤4:
number = 5
digits = 3
第五步:
number = 0
digits = 4
步骤#5进入(number == 0)
的条件,并返回digits
,此步骤为4
,返回步骤#4。
步骤#4将步骤#5的GetDigits(number / 10, ++digits);
结果返回到步骤#3。
步骤#3将GetDigits(number / 10, ++digits);
的结果(步骤#4)返回到步骤#2。
步骤#2将GetDigits(number / 10, ++digits);
的结果(步骤#3)返回到步骤#1。
然后步骤#1返回值4
,这是你在递归的最后一次交互中得到的结果。
关于prefix and postfix operations in c#的解释(数字++上的++数字)
答案 2 :(得分:-3)
这是错误的条件if (digits != 0)
你不能通过除法得到零
你必须使用if语句
if (digits != 0)
{
i++;
return getDigits(digits/10, i);
}
else
{
return i;
}