2015-10-22 17 views
1

這是我到目前爲止能夠想到的。從int中移除的方法

public static int evens(int n) 
    {   
    String num = "" + n; 
    if (n>1) { 

    if (n%2 == 0) { 
     return n + evens(n%10); 
    } 
    else { 
     int len = num.length(); 
     num = num.substring(0, len-1); 
     n = Integer.parseInt(num); 
     return n + evens(n%10); 
    } 
    } 
    else { 
    return n; 
    }  
} 

我的邏輯是使整一個字符串,然後通過10每一次分裂,使下一個數字(從右到左)在個位(使用整數前面的數字應該被丟棄我相信) 。然後我試圖用%2找到餘數,如果它不是== 0,那麼這個位置的數字是奇數,並以某種方式從字符串中消除該數字(通過獲取長度,然後從0 len-1)。我認爲我的問題包括可能的邏輯,顯然我的語法有些問題,並且定義字符串的方法的第一行導致它通過每次遞歸重新定義,並將其搞亂。

+0

我有時不知道爲什麼學校仍然執行遞歸,當時在校園外的使用是絕對沒有的。 (在我被灼傷之前,我意識到有時遞歸是排序樹等時的好朋友,但我仍然認爲遞歸是好僕人,但是殘酷的主人,應該儘可能避免) –

+0

n%10 == 4所以你永遠不會得到一個不是n%2 == 0的數字,你會得到一個stackoverflow異常。 –

+0

@TheLaw您對遞歸的「可用性」是正確的(通常可以通過使用迭代方法來防止)。但我認爲你錯過了一個重要的觀點:大學不*試圖讓你準備在這個行業工作,他們正在努力爲你準備更高的學位...... :) – alfasin

回答

1

緊湊型非字符串版本:

public static int evenDigits(int n) { 
    return (n&1) != 0 ? evenDigits1(n/10) : n < 10 ? n : n%10 + evenDigits(n/10)*10; 
} 

解釋:

public static int evenDigits(int n) { 
    if ((n & 1) != 0) { 
     // Last digit is odd, so remove it. Recurse on higher digits 
     return evenDigits(n/10); 
    } 
    if (n < 10) { 
     // Single digit number is even, so we're done 
     return n; 
    } 
    // Keep last digit (it is even). Recurse on higher digits 
    return n % 10 + evenDigits(n/10) * 10; 
} 
+0

這是完美的,比我想要做的更有意義。只有一個問題,在第一個陳述中,我不理解邏輯。單身&做什麼? –

+0

@golden_kiwi這是一個[按位運算符](https://en.wikipedia.org/wiki/Bitwise_operation#AND)。如果你願意,你可以用'n%2!= 0'來代替。 – Andreas

1

事實上,有主要是由於冗餘邏輯一些錯誤,但它可以很容易地得到(簡體和)固定:

public static String evenDigits(int n) 
{ 
    if (n > 0) { 
     if (n % 2 == 0) { 
      return n % 10 + "" + evenDigits(n/10); 
     } else { 
      return evenDigits(n/10) + ""; 
     } 
    } else { 
     return ""; 
    } 
} 

要特別注意在參數「開關」 return語句從:

return n + evenDigits(n%10); 

到:

return n % 10 + "" + evenDigits(n/10); 

通過返回n % 10您將返回當前正在處理的數字(這是您想要的),並通過使用n/10遞歸地發送該數字的「其餘」。


不同的方法可以是,根本不使用字符串。它與迭代方法相結合(即與上面建議的遞歸的)結果是類似以下內容:

public static int evenDigits(int n) { 
    int res = 0; 
    int mag = 0; 
    while (n > 9) { 
     int digit = n % 10; 
     n /= 10; 
     if (digit % 2 == 0) { 
      res += Math.pow(10, mag) * digit; 
      mag++; 
     } 
    } 
    return res; 
} 
+0

我剛剛試過這個,並且它由於某種原因混合了變量的順序。此外,該方法的返回類型必須是整數,而您將其更改爲字符串,這是前一個方面給我帶來很多麻煩的一個方面。 –

+0

我用'System.out.println(evenDigits(7439214))'調用了這個方法,它根據請求返回了'424'。如果你想返回一個int,你可以添加另一個方法來調用這個方法,並將結果從String轉換回int。 – alfasin

+0

我在原帖中使用的數字只是一個例子,程序必須爲任何整數工作。但仍然不確定爲什麼排序混合起來。另外,我完全同意它作爲一個字符串更有意義,但我們需要將它作爲整數返回。有沒有辦法將字符串解析爲int並在遞歸方法中將其作爲int返回? –

相關問題