算术递归

时间:2015-08-03 09:21:03

标签: java recursion

我正在尝试编写一个代码来计算给定整数 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

问题是什么,我该如何解决?

谢谢

3 个答案:

答案 0 :(得分:10)

您有两个问题:

您必须执行浮点除法(即将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 1/Sumto(n - 1) Infinity Sumto(n - 1) 0.0 Sumto(0) 0.0 <li ng-repeat="item in a.b.c | orderBy:'item.date'"> <a href="javascript:void(0);"> item1-2015</a> <a href="javascript:void(0);" >item2-2015</a> </li> </ul> { "sort" : [ { "name" : "xyz", "date" : "01-02-2001" }, { "name" : "pqr", "date" : "01-02-2002" } ] } aws glacier initiate-job

答案 1 :(得分:2)

  

但是,它始终输出: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; ,因为它是floating point division

所以添加另一个条件,比如

function checkFormElements(field) {
    if ($scope.options === undefined || $scope.optionsForm.$error[field] === undefined ) {
        return false;
    }
    var result = false;
    $.each($scope.optionsForm.$error[field], function(index, value) {
        // TODO: There *has* to be a better way than this to get the element. Angular must know the form control, whether it's named or not.
        var element = $('[name=' + value.$name + ']');
        if (!element.prop('disabled')) {
            result = true;
        }
    });
    return result;
}

$scope.formIsInvalid = function() {
    return checkFormElements("pattern");
};

$scope.fieldIsEmpty = function() {
    if ($scope.options === undefined || $scope.formIsInvalid()) {
        return false;
    }
    return checkFormElements("required");
};

答案 2 :(得分:0)

一些问题,首先没有,因为谐波系列没有闭合形式表达式。

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

  2. 删除术语1.0 / 0,因为它会为您提供无限浮点值。

  3. 如果您反转循环,您将获得更好的准确性。也就是说,首先计算较小的术语。否则你会低估浮点运算的总和。根据经验,首先要添加小数字。