2015-05-28 41 views
-1

我有這個練習,要求我創建一個程序來計算一個數字的奇數,所以如果數字是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++;,如此。要按位數檢查數字,我試圖將數字除以十,因爲它是一個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

令人驚訝的是@JunedAhsan註釋upvoted兩次... –

回答

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); 
    } 
} 
+0

對此進行了一些更改,但工作正常。代碼是正確的,但我沒有正確初始化大部分變量。哦,你忘了初始化'oddCounts'。 :) – Monok

+0

它沒關係,如果你不初始化類級變量。 – Rajesh

0

正如評論中所述,您應該將其與0比較,而不是'0'。後者將被解釋爲48,數字零的ASCII字符。

此外,absoluteInput永遠不會被分配到並始終有其初始值0inputAssoluto從哪裏來?

+0

是我的錯,與 'inputAssoluto' 翻譯錯誤,那就是 'absoluteInput'。與ASCII字符或整數數字0比較有什麼區別? – Monok

+0

呃,'0'和''0''在Java中是兩個完全不同的東西。第一個是一個數字,第二個是字符串中使用的字符。 – Glorfindel

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); 
    } 
} 
0

止跌」你想列出你的號碼,然後再次檢查每一個int,這意味着你可以按位數字檢查,而不必將數字除以十。一個非常短的解決方案就足夠了:(如果你把這個數字作爲一個字符串傳遞給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; 
} 
+0

在字符串和int之間來回轉換是一個相當浪費的操作 - 需要對象分配,調用內部循環。 – RealSkeptic

+0

每個數字的單個解析應該比當前的數學運算和比較回調解決方案少浪費。有更好的方法來使用'IEnumeable ',所以爲了簡單起見... –