使用递归查找几何和

时间:2017-09-05 21:56:56

标签: java recursion

我想更好地理解递归。我正在编写一个基本的几何系列方法,我知道可以通过循环更容易完成,但这不是目的。该方法产生0和1值的当前输出,其简单地为1和1.5。但对于2,当它应该是1.75时输出1.25。有关更好的方法的任何指示吗?

public static double geometricSum(int n) {
    if(n == 0){
        return 1;
    }
    n = n * 2;
    return 1.0 / n + geometricSum((int) (1/Math.pow(2, n)));
}

4 个答案:

答案 0 :(得分:1)

这是因为您将浮点数转换为int。

1/(2^2)=1/4=0.25 --> 0 

当你将你的浮子作为一个int传递时,你并没有让你的东西正常工作。 所以0.25 + geometricSum(0)= 1.25。 在第一个发生相同。你传递了0.5,但是变成了一个int,所以你没有得到适当的近似。

作为建议,总是将()放在你的数学函数上,以便制作程序,并且你自己,了解它以何种顺序计算数字。

答案 1 :(得分:0)

第一个问题是强制转换为int,给出错误的结果,已由reyeselda95描述。

隐藏了第二个问题,即如果你修复了这个问题,你就得到了这个问题:

public static double geometricSum(double n) {
    System.err.println("Calling with " + n);
    if(n == 0){
      return 1;
    }
    n = n * 2;
    return 1.0 / n + geometricSum((1/Math.pow(2, n)));
  }

使用提供的值2调用此选项会导致具有以下值的调用之间出现循环,从而导致堆栈溢出。

...
Calling with 0.4999999999999999
Calling with 0.5000000000000001
Calling with 0.4999999999999999
Calling with 0.5000000000000001
...

如果我理解正确的话,这可能是您正在寻找的功能:

public static double geometricSum(int count) {
    if (count == 0) {
      return 1;
    }
    return geometricSum(count-1) + Math.pow(2, -count);
}

答案 2 :(得分:0)

  1. 不要将float转换为int;
  2. 使用浮动时,您确定您的公式是否正确?如果参数为零,则递归会中断,但在将1.0 / Math.pow(2,n)的结果传递给函数时,您将获得StackOverflowError。

答案 3 :(得分:0)

这是我的python代码:

 def geometricSum(k):
     if k == 0:
         return 1
     return 1/2**k + geometricSum(k-1)


 k = int(input()) 
 print(geometricSum(k))

这与 2的幂有关,即 2 Pow n ,其中 n 是整数。

此处递归用于获取 n 的值序列。 就我而言,我必须计算 1 /(2 pow n)的值。