2017-05-05 123 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)) 

这也是在数学库的幂函数的实现的一部分。