如何以递归方式求解这个求和

时间:2014-01-27 12:25:06

标签: java recursion

今天,我的老师要求我们在Java中使用递归来实现下一个表达式(其中 n 是向用户询问的值):

Summation to be implemented

有可能吗?我找不到适合这个问题的解决方案,但我想我需要两个递归方法。

更新

到目前为止,我已经这样做了:

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或更大时,结果不准确。有人知道为什么吗?

可能存在与丢失精度相关的错误。

Trace

我非常感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:4)

提示:

  1. 是。一个可能的解决方案 涉及两个递归方法。

    (这是一个很好的解决方案......)

  2. 将问题(和解决方案)分为两部分;例如完整的“西格玛”和嵌入式“西格玛”。

答案 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);

从这里开始,我认为你应该能够赶上来。

将问题拆分成较小的子问题是所有程序员使用的技术。从小而轻松开始,随着时间的推移增加复杂性。