2017-04-12 84 views
1

乘以數字的序列這是在過去的考試是有我的同學和我難住了一個問題:使用遞歸沒有局部變量

使用遞歸來在一系列的每個數字相乘在一起,而無需使用本地變量。假設:

  • 的參數都是正
  • 第一參數小於該第二參數
  • 結果是小於2

例如,rangeProduct(1, 5)應返回120,因爲1x2x3x4x5是120

U SE這種方法簽名:

public static int rangeProduct(int valueOne, int valueTwo) { 
    return ?; 
} 

如果有人知道如何做到這一點,它只是有益於我的學習,如果你正在尋找一些實踐或只是覺得同情的飢餓,適度知識淵博的計算機科學專業,然後擺動!

+0

編寫一個正常的遞歸階乘函數,返回fact(valueTwo)/ fact(valueOne-1)。 – azurefrog

+0

@azurefrog - 這似乎是很多額外的工作來計算rangeProduct(1000006,1000007)。 :) –

+0

@AndyThomas我是一個數學專業,所以我自然用以前解決的問題來解釋我的所有答案...... ;-) – azurefrog

回答

0

我認爲這可能是你的問題的解決方案:

public static int rangeProduct(int valueOne, int valueTwo) 
{ 
    if(valueOne <= valueTwo -1){ 
     valueOne++; 
     return (valueOne-1) * rangeProduct(valueOne, valueTwo); 
    } 
    return valueTwo; 
} 
+0

儘量不要用++遞增局部變量,而是遞增值遞歸遞歸調用。 – f1sh

3

試試這個:

public static int rangeProduct(int valueOne, int valueTwo) { 
    if(valueOne>=valueTwo) 
    return valueOne; 
    return rangeProduct(valueOne, valueTwo-1) * valueTwo; 
} 

執行指定的準確順序計算:

1x2=2, 2x3=6, 6x4=24, 24x5=120 
0
public static int rangeProduct(int valueOne, int valueTwo) 
{ 
    // to avoid infinite loop if valueOne must be less or equal valueTwo 
    if (valueOne > valueTwo) { 
     throw new IllegalArgumentException(); 
    } 
    // terminal case : return one over two values 
    if (valueOne == valueTwo) { 
     return valueOne; 
    } 
    // recursive call with range's size decreasing 
    return valueOne * rangeProduct(valueOne+1, valueTwo); 
} 

減少數量遞歸調用的大小可以減少一邊兩邊

public static int rangeProduct(int valueOne, int valueTwo) 
{ 
    if (valueOne > valueTwo) { 
     throw new IllegalArgumentException(); 
    } 
    if (valueOne == valueTwo) { 
     return valueOne; 
    } else if (valueOne == valueTwo-1) { 
     return valueOne*valueTwo; 
    } 
    return valueOne*valueTwo * rangeProduct(valueOne+1, valueTwo-1); 
} 
0

這應該不難。

讓我們先迭代這樣做來理解這應該如何工作。

public static int rangeProduct(int valueOne, int valueTwo) 
    { 
     int prod = 1; 

     for(int i = valueOne; i <= valueTwo; i++) { 
      prod *= i; 
     } 

     return prod; 

    } 

所以做這個遞歸將只是簡單:使用遞歸

public static int rangeProduct(int valueOne, int valueTwo) 
    { 
     if (valueOne ==0 || valueTwo == 0) return 0; 

     //Range check 
     if (valueOne > valueTwo) return rangeProduct(valueTwo, valueOne); 

     if (valueOne < 0 && valueTwo > 0) return 0; //Because 0 is always in this range 

     if (valueOne == valueTwo) return valueTwo; 

     return valueTwo*rangeProd(valueOne, valueTwo-1); 
    } 

邏輯:假設你有一個範圍(3,5),則:

(3,5- )= - 5 *(3,4)= 5 * 4 *(3,3)= 5 * 4 * 3 = 60
(-3,-1)= -1 *( - 3,-2)= -1 * -2 *( - 3,-3)= -6
(-3,5)= 0(因爲該範圍包括0)
(5,3)與(3,5)相同,所以這也可以返回60。
(3,3) - >現在如果兩個no都一樣,答案基本上是3.

希望這有助於!

+0

「假設變量總是正值,第一個值小於第二值」使得80%的代碼行不再需要。更糟糕的是:在默認情況下返回0將使每個結果爲0. – f1sh

+0

我讀過。但是我的代碼更完整,也處理所有情況。我在哪裏返回零在默認情況下。我沒有得到。 – paratrooper

+0

你是對的,我錯過了第4行。 – f1sh

0

這裏有一個1班輪:

public static int rangeProduct(int valueOne, int valueTwo) { 
    return valueOne * (valueOne == valueTwo ? 1 : rangeProduct(++valueOne, valueTwo)); 
} 

live demo