我有这个练习要求我创建一个程序来计算一个数字的奇数位,所以如果数字是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;
为什么它会给我一个无限的递归?怎么了?为什么?还有其他办法解决这个问题吗?有什么想改进我的计划吗?
答案 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
永远不会被分配,并且始终具有初始值0
。 inputAssoluto
来自哪里?
答案 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;
}