2013-11-20 63 views
0

我有一些通過調用square,cube和hypercube方法計算冪的代碼。目前立方體方法調用程序中的方形方法,然後超立方體方法調用立方體方法。我想用調用power方法來替換對cube和hypercube的調用,但我完全被卡住了。創建不同的電源方法

這是原來的代碼工作。

public int square(int x){ 
    int i = (x*x); 
    return i; 
} 
public int cube(int x){ 
    int i = (x * square(x)); 
    return i; 
} 
public int hypercube(int x){ 
    int i = (x * cube(x)); 
    return i; 
} 

public int power(int x, int n){ 
    int k; 
    if (n==2){ 
     k = square(x); 
    } 
    else if (n==3){ 
     k = cube(x); 
    } 
    else if (n==4){ 
     k = hypercube(x); 
    } 
    else if (n==1){ 
     k = x; 
    } 
    else { 
     k = 1; 
     for (int i = 0; i < n; i++) { 
      k *= x; 
     } 
    } 
    return k; 
} 

現在就像我說我要替換立方體和超立方體中的方法調用的功率的方法的調用,那麼我還是有通話方,電力方法立方體等。所以我想完全刪除對這些方法的調用,因爲我不再需要它們。它真的讓我煩惱。 這是我迄今爲止,但它給了我StackOverFlowError。

public int square(int x, int n){ 
    int i = power(x, n); 
    return i; 
} 
public int cube(int x, int n){ 
    int i = power(x , n); 
    return i; 
} 
public int hypercube(int x, int n){ 
    int i = power(x , n); 
    return i; 
} 

public int power(int x, int n){ 
    int k; 
    if (n==2){ 
     k = square(x, n); 
    } 
    else if (n==3){ 
     k = cube(x, n); 
    } 
    else if (n==4){ 
     k = hypercube(x, n); 
    } 
    else if (n==1){ 
     k = x; 
    } 
    else { 
     k = 1; 
     for (int j = 0; j < n; j++) { 
      k *= x; 
     } 
    } 
    return k; 
} 
+0

我可以清楚地看到,我正在以完全錯誤的方式去解決問題,並且我可以明白爲什麼它不起作用。我只是感到困惑,因爲我可以如何讓它工作 –

+0

你在上一個問題中已經回答了這個問題。尋找'@ MightyPork'給出的答案 – Smit

回答

0

首先,你已經認識到這是一個很糟糕的事情發展方式。因此,除了通常的調用以避免重新發明輪子(除非是用於教育目的),其他人閱讀本文時,不會按照這種方式實現您的指數運算方法!

這就是說,你得到堆棧溢出(如此合適)的原因是你有一個循環定義。查看這個最簡單的方法是試圖追蹤power如何工作。假設我想運行power(3, 2)。怎麼了?那麼power(3, 2)認爲這是n == 2的一個實例,因此轉到square方法。然而,square方法依賴於power方法來完成任務,然後重複無限次。因此,您會在堆棧中堆積函數調用,直到空間用完。

P.S.順便說一下,如果你正在尋求實現整數冪乘以個人建構,你可能想要重複平方。它使你的代碼更快(對數乘法運算而不是線性數)。

0

在我看來,這裏有一個無限循環。 如果n = 2,則電源調用sqaure,反過來調用電源,n也不會改變。

通常當你處理無窮大時,你會得到StackOverFlowError。

如果你想擺脫那些,power(x,n)必須獨立於立方體或正方形。