我正在尝试编写一个代码来计算给定整数 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
问题是什么,我该如何解决?
谢谢
答案 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.0 / n
。
删除术语1.0 / 0
,因为它会为您提供无限浮点值。
如果您反转循环,您将获得更好的准确性。也就是说,首先计算较小的术语。否则你会低估浮点运算的总和。根据经验,首先要添加小数字。