算法递归



我正试图编写一个代码,计算以下给定整数 n :

1/1 + 1/2 + 1/3 ... + 1/n

这是我目前为止写的代码:

public class RecursiveSum
{
  public static double Sumto(int n)
  {
    if (n == 0) { return 0.0; }
    else if (n > 0) { return 1/n + 1/Sumto(n - 1); }
    else { throw new IllegalArgumentException("Please provide positive integers"); }
  }
  public static void main(String[] args)
  {
    System.out.println(Sumto(5));
  }
}
但是,它总是输出:
Infinity

是什么问题,我怎么解决它?

谢谢

有两个问题:

您必须执行浮点除法(即将1/n替换为1.0/n),并且您应该将Sumto(n - 1)添加到1.0/n以得到Sumto(n)

  public static double Sumto(int n)
  {
    if (n == 0) { return 0.0; }
    else if (n > 0) { return 1.0/n + Sumto(n - 1); }
    else { throw new IllegalArgumentException("Please provide positive integers"); }
  }

得到Infinity的原因是当Sumto(n - 1)0.0, Sumto(0)0.0时,1/Sumto(n - 1)返回Infinity

但是,它总是输出:Infinity

因为你在接下来的步骤中执行1/0,生成Infinity

else if (n > 0) { return 1/n + 1/Sumto(n - 1);

你认为n > 0逃避n / 0的东西,但不是!想想当n = 1传递n > 0的情况,但落入陷阱:

1/Sumto(n - 1)
1/Sumto(1 - 1)
1/Sumto(0)

,其中Sumto(0)返回0.0。因此,

 1/0.0

生成Infinity。此外,使用1.0/n代替1/n,因为它是浮点除法。

添加另一个条件,比如

if(n == 1) 
    return 1;

有几个问题,首先说明由于调和级数没有闭形式表达式。

  1. 需要使用浮点除法计算每一项。重写为1.0 / n .

  2. 去掉1.0 / 0这个词,因为它会给你一个无限的浮点值

  3. 如果反向循环,您将获得更好的精度。也就是说,先计算较小的项。否则你会低估浮点运算的总和。作为经验法则,总是先添加小数字。

最新更新