2011-11-21 108 views
-1

我在這個函數中做了什麼錯誤。我很確定問題在於base = exp(base, pwr /= 2) * exp(base, pwr /= 2);,但我想不出合乎邏輯的原因。有沒有一種可能的方式來編寫這樣的參數?提前致謝。 (我的這個功能的輸出是2這是錯誤的)無法獲得遞歸函數的正確輸出

#include <iostream> 
using namespace std; 

unsigned long& exp(unsigned long& base, unsigned long& pwr) 
{ 
    if(pwr == 0) 
     base = 1; 
    else if(pwr == 1) 
     base = base; 
    else 
     base = exp(base, pwr /= 2) * exp(base, pwr /= 2); 
    return base; 
} 

int main() 
{ 
    unsigned long n=2, m = 4; 
    cout << exp(n,m) << endl; 
    return 0; 
}  
+0

你有沒有嘗試在調試器中通過這個步驟? –

+0

應該做什麼功能以及預期輸出是什麼? –

+4

由於您在各處都使用引用,因此對「base」或「pwr」所做的每個操作都將影響當前對該函數的所有調用。刪除代碼中的所有引用,然後重試;如果它仍然無法工作,至少它將比調試更容易100倍。 – tenfour

回答

2

這裏有五件事情需要注意有關該行:

base = exp(base, pwr /= 2) * exp(base, pwr /= 2); 
  1. 如上評論指出,base被引用,而不是值傳遞的,所以只有它的一個副本,你改變它的價值。這是一個壞主意。
  2. pwr也是按引用傳遞的,當你使用/=,而不只是/你改變它的價值。此行中有兩條/=語句,因此在此行運行後,pwr現在具有其原始值的四分之一。
  3. 每次運行此行時,exp函數都會運行兩次。存儲該值並將其平方值更有意義。
  4. /2是整數除法,所以它會向下取整。所以,如果你給它一個數字,如3爲指數,將無法正常工作,因爲3/2是1。如果你糾正對方失誤,並與7指數的調用它,它最終會只是做exp(2,7) = exp(2,3)*exp(2,3) = exp(2,1)*exp(2,1)*exp(2,1)*exp(2,1) = 16時明顯正確的答案是128這個功能,如設計,才能正確當指數是2
  5. 好東西的冪,4號是真實的工作,因爲如果你沒有得到EXP(2,1.5)你永遠不會終止,因爲它不符合你的基本情況。一般來說,你應該重新考慮你的算法。
+0

啊,謝謝解釋。 – ihm

+0

6。在同一行內分配兩次變量。你的'/ ='pwr加兩次,這可能會起作用,或者導致大量的錯誤。 – zennehoy

+0

這實際上是2點的一部分。我注意到這是它的原始價值的四分之一。不過,我會編輯它以使其更加清晰。 –

0

這很奇怪。你的代碼對我來說,在邏輯上和句法上都是正確的。我會同意你的問題在哪裏。我不想自己調試它,我建議你嘗試一下程序的簡單數字(n = 1,m = 1; n = 4,m = 1; n = 2,m = 1; n = 2,m = 0 )。如果這一切都很好,那麼很明顯,問題出在你指出的地方。

我知道,沒有解決您的問題,但它是一個開始(如果你還沒有做到的話)。我會,因爲我瘋了,也儘量

else { 
    power = power-1; 
    base = base * exp(base, power); 
} 

我不知道這會幫助(它肯定會慢一些),但也許值得嘗試?我也會刪除很多參考文獻。

+0

對不起,我在這裏沒有C-Plus-Plus程序/編譯器,愚蠢的macbook(只是開玩笑,我喜歡它們) – victoroux

+0

是的,我知道問題出在那裏,但我不明白爲什麼它是錯誤的,我可以寫出來e代碼像'else {pwr/= 2; base = exp(base,pwr)* exp(base,pwr);}'並且得到正確答案。但我想弄清楚這個表達方式有什麼問題。 – ihm

+0

然後使用各種數學計算它自己。你會很容易找到,哈哈。舊的紙和筆沒有把戲...... – victoroux

1

既然你聲稱這是不是功課:

  1. 正如其他人所提到的,引用不屬於這裏。每次遞歸調用都需要計算中特定點的值。

  2. exp(base, pwr /= 2) * exp(base, pwr /= 2);

    當你的指數是不是2的倍數在修復參考的東西,如果你還是真的想去做這樣按預期這樣可不行,請嘗試:

    exp(base, pwr/2) * exp(base, (pwr/2 + pwr%2));

+0

我還在想。我明白,它不工作,如果它不是2的倍數。 – ihm

3

我能看到的第一個問題是您通過basepwr作爲參考。 當你這樣做時,每次你打電話給exp時,他們的全局值都會被修改,所以你得到的輸出應該是基於你寫的代碼。

爲了得到正確的結果,我將取代

exp(base, pwr /= 2) * exp(base, pwr /= 2); 

exp(base, pwr/2) * exp(base, pwr/2); 

因爲你exp(2, 4) = exp(2, 2) * exp(2, 1)是不是真的正確..

+0

也作爲百事可樂說,這不會與指數不是2的權力... –

1

我們可以通過這一步很容易,第一通過exp基礎的時間是2,pwr是4,所以我們用exp(2,1)* exp(2,0)調用(記得你設置pwr = pwr/2)。因此,第一個計算結果爲2,第二個計算結果爲1,因此您返回的結果是2 * 1,這是2.我認爲您的代碼意味着返回exp(2,1)* exp(2, 1)。