使用递归来获取整数中的位数

时间:2012-09-21 11:04:25

标签: c# recursion

我正在编写一个函数,它应该使用递归来获取整数中的位数,例如: 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;
        }
    }
}

3 个答案:

答案 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;
}