2017-05-05 156 views
-2

我想在java中編寫一個函數,該函數可以找到引發另一個操作數的結果。找到另一個號碼的號碼?

不能使用pow功能或任何形式的循環。什麼是可能的解決方案?我試過「^」,但沒有奏效。

public static String raiseP(int op1, int op2){ 
    int result = op1^op2; //Doesn't Work 
    return result; 
} 

會有一種方法使用基本數學來做到這一點嗎?

我已經寫:

public static int pow(int x, int y, int n, int z){ 
    if (y == n){ 
     System.out.println(z); 
     return z; 
    } 
    else{ 
     z = z*x; 
     n += 1; 
     pow(x,y,n,z); 
     return 0;  
    } 

} 
ex: pow(5,9,0,1) == 5^9 

,但我不允許使用遞歸。

+2

你允許使用遞歸函數嗎? –

+1

請顯示您在帖子中嘗試過的內容。 –

+3

如果你不能使用任何形式的循環或'Math.pow',那麼唯一的其他選擇是遞歸? –

回答

3

,而不能稱之爲Math.pow或使用循環,唯一的可能是使用遞歸:

public int powerFunction(int base, int exponent) { 
    if(exponent < 0){ throw new IllegalArgumentException("unsupported negative pow"); } 
    if(exponent == 0){ return 1; } 
    else{ 
     return base * powerFunction(base, exponent - 1); 
    } 
} 

調用powerFunction(2, 3)會給你:1 * 2 * 2 * 2 = 8

+6

請不要爲他們解決人的功課。一個很好的提示是好的,即使是一個算法的鏈接,但提供一個徹底的實現通常是對他們的損害。此外,這種方法並不理想,因爲傳遞非常高的指數有可能導致堆棧溢出。 – dasblinkenlight

+0

這個限制是假設指數是一個正整數。仍然+1 –

+0

是的,需要檢查正指數。 'if(exponent <0)throw something'。 – Raphael

0

遞歸可以幫助你:

public static int myPowerRec(int op1, int op2, int res) { 
    if (op2 == 0) { 
    return res; 
    } 
    else { 
    return (myPowerRec(op1, op2 - 1, op1 * res)); 
    } 
} 

您需要將資源初始化到1(myPowerRec(23, 2, 1)會給你1 * 23 * 23)。 這個遞歸被稱爲tail recursion,並且允許你使用這個函數而不會出現堆棧問題。

要小心,您必須先檢查op2值。

+0

這是相當不錯的,但是否支持尾巴呼叫優化? – Raphael

+0

的確我沒有檢查,Java不是我的主要語言。 – Ankirama

0

使用for循環:

public static int power(a, b) { // a^b 
    int p = 1; 
    for (int i = 1, i <= b; i++) 
    p *= a; 
    return p; 
} 
+0

我不能使用循環 –

1

你可以簡單地使用

pow(x,y) = exp(y*log(x)) 

這也是在數學庫的冪函數的實現的一部分。