返回1 + 1/2 + 1/3 + ... + 1 / n系列的总和

时间:2014-08-28 03:45:58

标签: java recursion methods sum

我想帮助你纠正这种方法的输出。递归版本返回我需要的内容,但non_recursive版本不会返回相同的结果。这是我的代码:

public static double sum_nr(int n){
    int result = 1;
    for(int i=n-1; i>0; i--){
        result += 1/i;
    }
    return result;
}

public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    System.out.println("Is the string a palindrome or not? ");
    String test = scan.nextLine();
    System.out.println("Answer: " + isPalindrome_r(test));
    System.out.println("Answer: " + isPalindrome_nr(test));
    System.out.println("What is the sum of n number: ");
    int test2 = scan.nextInt();
    System.out.println("Answer: " + sum_r(test2));
    System.out.println("Answer: " + sum_nr(test2));
}

n = 101.6179775280898876

时的递归版本

非递归版n = 102.0

我希望这两者都匹配。你能救我吗?

3 个答案:

答案 0 :(得分:2)

请勿int使用result。声明它是double。另外,使用分数的双字面值进行除法。这两个问题共同造成了不良行为。特别是,1/i是整数除法,并且对于所有i>评估为0。 1.如果您使用1.0/i,则不会发生这种情况,因为i会在分割前升级为double

public static double sum_nr(int n){
    double result = 1;         // <-- first change
    for(int i=n-1; i>0; i--){
        result += 1.0/i;       // <-- second change
    }
    return result;
}

答案 1 :(得分:0)

对于i == 1,

1/i为1,对于任何i&gt;为0 1,因为您正在使用int。因此,你的结果是2。

使用doublefloat代替进行计算。

答案 2 :(得分:0)

以下两个版本返回相同的结果:

public static void main(String[] args) throws IOException {

        System.out.println(sum_nr(10)); //3.928968253968254
        System.out.println(sum_r(10));  //3.928968253968254
    }

    public static double sum_nr(int n){
        double result = 1;
        for(int i = n; i > 0; i--){
            result += 1.0/i;
        }
        return result;
    }

    public static double sum_r(int n){
        if (n == 0) {
            return 1;
        }
        else {
            return 1.0/n + sum_r(n-1);
        }
    }