2016-01-21 69 views
3

你好,我需要建立一個遞歸,用零替換偶數位: 例如 - 數字1254將是1050 數字332-將是330 和24號 - 將是0Java-建立一個遞歸,用零替換數字

我開始做這個工作,但有一段時間

public static int replaceEvenDigitsWithZero(int number){ 
    if(number<1) 
     return number; 
    if(number%2==0 && number%10!=0){ 
     int temp=number%10; 
     return(number/10+replaceEvenDigitsWithZero(number-temp)); 
    } 
    return(replaceEvenDigitsWithZero(number/10)); 
} 
public static void main(String[] args) { 
     int num1 = 1254; 
     System.out.println(num1 + " --> " + replaceEvenDigitsWithZero(num1)); 

     int num2 = 332; 
     System.out.println(num2 + " --> " + replaceEvenDigitsWithZero(num2)); 

     int num3 = 24; 
     System.out.println(num3 + " --> " + replaceEvenDigitsWithZero(num3)); 

     int num4 = 13; 
     System.out.println(num4 + " --> " + replaceEvenDigitsWithZero(num4)); 
    } 

} 
+0

你是什麼意思的「無能」?你得到錯誤的結果嗎?你有任何錯誤信息?如果你沒有說出你的問題是什麼,我們如何幫助你? – Psytho

+0

你真的需要遞歸嗎?甚至是簡單的迭代都會很好嗎? – BigMike

回答

-2

1轉換爲字符串

2 F(串)之後是很笨:取˚F IRST數:0

3連擊到F取代2,4,6,8個字符(其餘字符串)

4轉換成int

+0

遞歸在哪裏? – BigMike

+0

這個算法的遞歸在哪裏? – Psytho

+0

@BigMike +遞歸! –

4

因爲你的方法只看最後一位,當input >= 10時,應該始終使用input/10自稱。

然後,您將遞歸返回的值乘以10並將最後一個數字加回(如果奇數)。

public static int replaceEvenDigitsWithZero(int number) { 
    int result = 0; 
    if (number >= 10) 
     result = replaceEvenDigitsWithZero(number/10) * 10; 
    if (number % 2 != 0) 
     result += number % 10; 
    return result; 
} 
2

如果你需要有1套,這裏有雲:;)

public static int replaceEvenDigitsWithZero(int number) { 
    return (number%2 == 0 ? 0 : number % 10) + (number<10 ? 0 : 10 * replaceEvenDigitsWithZero(number/10)); 
} 
0

你需要採取跟蹤當前的位置在你的電話號碼。 在你當前的函數中,你只會返回你的數字的第一個數字(因爲每次調用遞歸時都將它除以10)。

public static int replaceEvenDigitsWithZero(int number, int position){ 

    // cancel condition: 
    if(number < 10 * position) { 
     return number; 
    } 

    // edit number: 
    if (position > 0) { 
     int currentNumber = number/(10 * position);  
    } else { 
     currentNumber = number; 
    } 

    if(currentNumber%2==0){ //even? 
     int multiplyValue = currentNumber % 10; // get rest of division by 10 (== digit in current position) 
     number = number - (multiplyValue * (10 * position)); // set current position to zero 
    } 

    // recursive call: 
    return replaceEvenDigitsWithZero(number,position+1); 
} 

沒有測試我的代碼,但我希望你能知道如何去做。使用replaceEvenDigitsWithZero(num1,0)開始。

2

嗯...設計一個遞歸算法具有總是相同的步驟:

  1. 識別基本情況,那就是將終止遞歸調用的情況。

  2. 減少問題變小(朝向基本情況)。單個位爲基礎案例:

對於此要求的問題可以容易地通過通過10這也容易導致基體的情況下將變得更小。所以一個快速實現可以是:

public static int replaceEvenDigitsWithZero(int number) { 
    // I added handling of negative numbers ... 
    if (number < 0) { 
     return -replaceEvenDigitsWithZero(-number); 
    } 

    // base case 
    if (number < 10) { 
     return replaceOneDigit(number); 
    } 

    // recursion 
    int lastDigit = number % 10; 
    int remainder = number/10; 
    return replaceEvenDigitsWithZero(remainder) * 10 + replaceOneDigit(lastDigit); 
} 

public static int replaceOneDigit(int digit) { 
    return (digit % 2 == 0) ? 0 : digit; 
} 

我添加了一個輔助方法,用於將偶數轉換爲零。

的輸出現在是:

1254 - > 1050

332 - > 330

24 - > 0

13 - > 13