为什么这种用于计算数字的所有奇数位的递归方法会产生无限递归?

时间:2015-05-28 09:50:42

标签: java recursion methods infinite

我有这个练习要求我创建一个程序来计算一个数字的奇数位,所以如果数字是12345,它将计为3,因为1,3和5.我开始创建一个递归方法,我的第一个,有一个分支的if-else。使用它的目的是看if (inputNumber % 2 == '0')。如果是,则该数字的最后一位数字将为0,2,4,6或8,因为如果由2模式化,则只有那些数字给出0,因此oddDigitsCounter不会增长。否则,if (inputNumber % 2 == '1'),该数字的最后一位数将是1,3,5,7或9. oddDigitCounter++;,所以。为了逐位检查,我试图将数字除以10,因为它是int变量,所以它不会在浮点后保存任何数字。 这是现在的方法:

public static int oddDigitCounter (int number) {

    int oddCount, moduledNumber, dividedNumber, absoluteInput;

    oddCount = 0;
    absoluteInput = Math.abs(number);
    moduledNumber = absoluteInput % 2;
    dividedNumber = absoluteInput / 10;

    if (absoluteInput == '0') {
        oddCount = oddCount;  }
    else if (moduledNumber == '0') {
        oddCount = oddCount;
        oddDigitCounter(dividedNumber); }
    else // (number % 2 != 0) 
        oddCount++;
        oddDigitCounter(dividedNumber); }

    return oddCount;

为什么它会给我一个无限的递归?怎么了?为什么?还有其他办法解决这个问题吗?有什么想改进我的计划吗?

4 个答案:

答案 0 :(得分:1)

您不使用递归调用的结果。您还将整数与字符“0”进行了比较,这与0比较不同。

public static int oddDigitCounter (int number) 
{
    int moduledNumber, dividedNumber, absoluteInput;

    inputAssoluto = Math.abs(numero);
    moduledNumber = absoluteInput % 2;
    dividedNumber = absoluteInput / 10;

    if (absoluteInput == 0) {
        return 0;
    }
    else if (moduledNumber == 0) {
        return oddDigitCounter(dividedNumber); 
    }
    else {
        return 1 + oddDigitCounter(dividedNumber); 
    }
}

答案 1 :(得分:0)

正如评论中所述,您应该与0进行比较,而不是'0'。后者将被解释为48,数字为零的ASCII字符。

此外,absoluteInput永远不会被分配,并且始终具有初始值0inputAssoluto来自哪里?

答案 2 :(得分:0)

在递归之外声明奇数计数器,你应该得到结果:

static int oddCounts;

public static int oddDigitCounter(int number) {
    int moduledNumber, dividedNumber, absoluteInput = 0;

    absoluteInput = Math.abs(number);
    moduledNumber = absoluteInput % 2;
    dividedNumber = absoluteInput / 10;

    if (absoluteInput == 0) {
        return 0;
    } else if (moduledNumber == 0) {
        return oddDigitCounter(dividedNumber);
    } else {
        oddCounts++;
        return 1 + oddDigitCounter(dividedNumber);
    }
}

答案 3 :(得分:0)

您不想列出您的号码,然后再将每个号码作为单个int进行检查,这意味着您可以逐位检查,而不必将数字除以10。

一个非常简短的解决方案就足够了:(如果您将数字作为字符串传递,LINQ单线程可以为您提供所需的内容)。

static int OddDigitCounter(int numbers)
{
    var c = numbers.ToString();
    var oddcount = c.Count(no => int.Parse(no.ToString()) % 2 != 0); //<--one liner 
    return oddcount;
}