gpt4 book ai didi

像MathPow这样的Java方法,在效率方面具有迭代和递归的解决方案-作业

转载 作者:行者123 更新时间:2023-12-02 08:45:25 27 4
gpt4 key购买 nike

我的作业有问题,需要帮助!

问题 1:

完成下面的 Java 方法,以便 raiseToPower(x,n) 将数字 x 提高到整数 n 次方(即计算值 xn )。请记住 x-n = 1/xn,x0 = 1。

您应该以尽可能少的步骤(即 O(log n) 时间)完成此操作。

给出一个非递归(迭代)的解决方案:

这是我的解决方案:

    public static double raiseToPower (double x, int n) {
double res=1;
boolean neg=false;
if(n<0)
{
neg=true;

}
if(n>0)

for (int i=0;i<n;i++) {
res = res * x;
}
if(neg==true) {
n=n*-1;
for (int i=0;i<n;i++) {


res = res * x;
}
res=1/res;
}


return res;
}

但是这是不正确的,因为效率不高

例如,这是我的错误:52.49 的 9 次方需要 9 个步骤才能解决,但它本来可以通过 4 个步骤完成89.89 的 75 次方需要 75 步才能解决,但它本来可以通过 7 步完成78.57 的 63 次方需要 63 步才能解决,但它本来可以通过 6 步完成70.17 的 44 次方需要 44 步才能解决,但它本来可以在 6 步内完成

注意:不得在方法 java.lang.MathPow 中使用

问题2:

我需要编写与问题1完全相同的代码,但采用递归方式

这是我的问题:给出一个递归解决方案:

这是我的代码:

     public static double raiseToPower (double x, int n) {
ouble dev=0.0;
if (n == 0) {
return 1;
} else {
if (n < 0) {
double count= raiseToPower (x, n+1);
dev=count*x;
return 1 / raiseToPower (x, -n);
}
if (n > 0) {
double count= raiseToPower (x, n-1);
dev=count*x;



}

}
return dev;
}

这段代码是正确的,但效率不高。

例如,这是我的错误:

53.31 的 44 次方需要 44 步才能解决,但它本来可以在 6 步内完成6.90 的 74 次方需要 74 步才能解决,但它本来可以通过 7 步完成80.76 的 76 次方需要 76 个步骤才能解决,但它本来可以通过 7 个步骤完成51.44 的 86 次方需要 86 步才能解决,但它本来可以通过 7 步完成76.26 的 50 次方需要 50 步才能解决,但它本来可以通过 6 步完成63.53 的 93 次方需要 93 步才能解决,但它本来可以在 7 步内完成

注意:不得在方法 java.lang.MathPow 中使用

感谢大家帮助并解决了这两个问题!!!

最佳答案

您可以通过将 n 分解为 2 的幂来计算 O(logN) x^n,如下所示:

9 = 1+8

15=1+2+4+8

因此,x^9= (x^1)*(x^8)。

为了将 n 分解为 2 的幂,可以使用按位运算符。像这样: n&pow2 意味着你在 N 和 pow2 之间进行“与”运算,这意味着如果 n 有一个位 1 并且 pow2 也有该位 1,那么结果将是非零。鉴于 pow2 必须有一个位 1(它是 2 的幂),您基本上可以检查 n 的每一位。因此,您将 n 分解为 2 的幂,当您循环遍历 2 的幂时,您可以简单地保留一个 powx ,这意味着 x^(pow2) ,然后每当您发现 n 确实由以下组成时,将其乘以 res 2 的幂。

因此我们可以为第一个解决方案编写此代码:

  public static double raiseToPower (double x, int n) {
double res=1;
double powx=x;
int pow2=1;
boolean neg=false;
if(n<0)
{
neg=true;
n=n*-1;
}
while(n!=0) {
if((n&pow2)!=0)
{
res=res*powx;
n=n-pow2;
}
powx=powx*powx;
pow2=pow2*2;
}
if(neg==true)
res=1/res;
return res;
}

这里有更多关于按位运算符的文章:https://www.tutorialspoint.com/java/java_basic_operators.htm

同样,您可以修改递归代码以在 O(logN) 内获得它。

这是递归代码:


public static double raiseToPower(double x, int n)
{
boolean neg= false;
double res=1;
if(n<0)
{
neg=true;
n=-n;
}

if (n == 0) return 1;
if (n % 2 == 0)
{
res= raiseToPower(x, n / 2);
res=res*res;
}
else
{
res= x * raiseToPower(x, n - 1);
}
if(!neg)
return res;
return 1/res;
}

关于像MathPow这样的Java方法,在效率方面具有迭代和递归的解决方案-作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61117215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com