今天,我的老师要求我们在Java中使用递归来实现下一个表达式(其中 n 是向用户询问的值):
有可能吗?我找不到适合这个问题的解决方案,但我想我需要两个递归方法。
到目前为止,我已经这样做了:
public static double sumatorio(int n){
if(n==1)
return 1;
else{
return (1 + ((n-1) * segundoSumatorio(n))) + sumatorio(n-1);
}
}
public static double segundoSumatorio(int n){
if(n==1)
return 1;
else
return 1/(double)n + segundoSumatorio(n-1);
}
看起来它是正确的,但当n = 3或更大时,结果不准确。有人知道为什么吗?
可能存在与丢失精度相关的错误。
我非常感谢您提供的任何帮助。
答案 0 :(得分:4)
提示:
是。一个可能的解决方案 涉及两个递归方法。
(这是一个很好的解决方案......)
将问题(和解决方案)分为两部分;例如完整的“西格玛”和嵌入式“西格玛”。
答案 1 :(得分:3)
这是您的代码已修复。注意第二个sumatorio如何需要2个参数,
以及如何在递归调用时不更改第二个参数
这是你的公式所说的而不是你实现的。
这不是精确错误,你可能已经想到了这一点 因为这个错误对于这种情况的精度误差来说听起来太大了 小的n。
public class Test {
public static void main(String a[]) throws Exception {
System.out.println(sumatorio(1));
System.out.println(sumatorio(2));
System.out.println(sumatorio(3));
System.out.println(sumatorio(4));
}
public static double sumatorio(int n){
return sumatorio(n ,n);
}
public static double sumatorio(int n, int m){
if(n==1)
return 1;
else{
return (1 + ((n-1) * segundoSumatorio(m))) + sumatorio(n-1, m);
}
}
public static double segundoSumatorio(int n){
if(n==1)
return 1;
else
return 1/(double)n + segundoSumatorio(n-1);
}
}
答案 2 :(得分:2)
如果此任务对您来说太难了,请尝试将其拆分为较小的块。该问题要求求和,通过递归实现。我相信你可以通过实现一个循环来做总结。类似的东西:
int sum = 0;
for(int i = 1; i < n; i++){
sum = sum+i;
}
这将汇总从1到(n-1)的所有数字。
您可以通过编写一个简单的添加方法将循环转换为递归:
int sum = 0;
int doSum(int n){
if(n <= 1){
return 1;
}
else{
return n + doSum(n - 1);
}
}
sum = doSum(n);
从这里开始,我认为你应该能够赶上来。
将问题拆分成较小的子问题是所有程序员使用的技术。从小而轻松开始,随着时间的推移增加复杂性。