2015-12-18 49 views
-3

作爲學習遞歸的練習,我試圖通過輸入兩個整數(包括正值,負值和零值)顯式重新創建加法運算符。然而,這個問題是我對自己設定了一些嚴格的限制。使用約束在Java中顯式創建加法運算符。不可解?

約束

使用遞歸和條件

不能使用迭代(例:forwhile等)

不能使用隱迭代(例:++,--

不能用一個數學運算符(例如:+-/等)

不能使用簡寫的任務(例如:+=-=/=等)

代碼

這裏是我的代碼:

/** 
* Create explicit addition with given constraints. 
* 
* @author CodingBash 
* 
*/ 
public class Addition { 

    /** 
    * Function call 
    * 
    * @param args 
    */ 
    public static void main(String[] args) { 
     int firstNumber = 3; 
     int secondNumber = 6; 

     // firstNumber + secondNumber 
     int result = add(firstNumber, secondNumber); 

     System.out.println(result); 
    } 

    /** 
    * Function recursively takes a number from 'giver' one at a time and 
    * "gives"/"adds" it to 'receiver'. Once nothing more to "give" ('giver' 
    * ==0), then return the number that received the values, 'receiver'. 
    * 
    * @param receiver 
    *   - parameter that accumulates (++ each layer) 
    * @param giver 
    *   - parameter that dissipates (-- each layer) 
    * @return 
    */ 
    public static int add(int receiver, int giver) { 
     if (giver != 0) { 
      return add(directionalIncrement(receiver, giver), 
        directionalIncrement(giver, -giver)); 
     } else { 
      return receiver; 
     } 
    } 

    /** 
    * Increments (or decrements) the 'number' based on the sign of the 
    * 'direction' 
    * 
    * @param number 
    *   - base number that is incremented or decremented 
    * @param direction 
    *   - number that determines if base number increments or 
    *   decrements. If positive, increment. If negative, decrement. 
    * @return 
    */ 
    public static int directionalIncrement(int number, int direction) { 
     int incrementalValue = (direction > 0) ? 1 : -1; 
     return add(number, incrementalValue); // StackOverflowError 
    } 
} 

的代碼產生在return add(number, incrementalValue);一個StackOverflowError。儘管如果將語句替換爲return number + incrementalValue,代碼的運行與整型輸入的任何變化完全相同。但是,這種變化偏離了約束條件。

這個任務的某些約束是不可解的嗎?如果是這樣,請解釋如何。如果沒有,請在給定約束內提供一個解決方案,最好與我的實施相似。

+0

您認爲您的加入作品如何? –

回答

1

您與giver!=0進入附加功能,則directionalIncrement(giver, -giver)被稱爲回你一個新的值giver爲1或-1,所以不爲0。然後你再次調用addgiver!=0。是的,這將導致StackOverFlowError,因爲它一遍又一遍地呼叫add而不會回到原來的呼叫。代碼必須返回到原始調用才能處理堆棧的內容。你的代碼只是添加到堆棧中。

+0

換句話說,遞歸永遠不會滿足其*停止條件*。 – user1803551