使用递归来查找几何序列的总和

时间:2018-01-21 15:06:35

标签: java recursion

    public static double sumGeom(double term, double ratio, int n)
    {
        double sum = 0;

        if (n<=1)
        {
            return term;
        }
        else
        {
            sum = sum + term * ratio;
            return sumGeom(term * ratio, ratio, n-1);
        }
    }
}

//Geometric sequence: 2 4 8 16 32
//Geometric sum: 62

我是Java的初学者,我的任务是仅使用递归查找几何序列的总和。

参数是:term = 2,ratio = 2和n = 5.以上是我尝试的代码。我很难想象递归是如何工作的,所以我不知道我的代码出了什么问题。而不是给我62的理想答案,而是让我得到32。这段代码有什么问题?

我也尝试过这个版本,但仍然是32而不是62:

public static double sumGeom(double term, double ratio, int n)
{
    double sum = 0;

    if (n<=1)
    {
        return term;
    }
    else
    {
        return sum = sum + sumGeom(term * ratio, ratio, n-1);
    }
}
}

2 个答案:

答案 0 :(得分:0)

您不需要变量sum 让我们看看最后一次递归调用。参数将为sumGeo(32, 2, 1),您将返回sum + sumGeo(),即0 + 32。这将是该方法返回的价值 递归并不容易理解,特别是对于初学编程的人来说 尝试可视化每个方法调用。此外,您可以在IDE中使用调试器来查找代码中发生的情况。

尝试这样的事情

public static double sumGeom(double term, double ratio, int n) {
    if (n == 1) {
        return term;
    }

    System.out.println("term: " + term);
    return term + sumGeom(term * ratio, ratio, n - 1);
}

答案 1 :(得分:0)

你做错了。您需要了解递归的工作原理。

你的第一个答案,你没有使用总和,而且你发生的事情只是将术语与比率相乘,得到输出32.

   public static double sumGeom(double term, double ratio, int n)
    {
        double sum = 0;

        if (n<=1)
        {
            return term;
        }
        else
        {
            sum = sum + term * ratio;
            return sumGeom(term * ratio, ratio, n-1);
        }
    }

你的第二个答案,你的两个答案中的一个错误是你将你的总和重新定义为0所以基本上你每次都要加0 + term *比率。

public static double sumGeom(double term, double ratio, int n)
{
    double sum = 0;

    if (n<=1)
    {
        return term;
    }
    else
    {
        return sum = sum + sumGeom(term * ratio, ratio, n-1);

    }
}

正确的方式(解决方案)

在此我们将术语添加回自身以获得所有返回值的总和。

public static double sumGeom(double term, double ratio, int n)
    {
        if (n<=1)
        {
            return term;
        }
        else
        {
            term = term + sumGeom(term * ratio, ratio, n-1);

            return term;
        }
    }

如果你想看看它是如何进入并返回以及每个步骤的值是什么,试试这个解决方案

public static double sumGeom(double term, double ratio, int n)
{
    if (n<=1)
    {

        System.out.println("term : "+ term + " ");

        System.out.println("ratio : "+ ratio + " ");

        System.out.println("n : " + n);

        return term;
    }
    else
    {

        System.out.println("term : "+ term + " ");

        System.out.println("ratio : "+ ratio + " ");

        System.out.println("n : " + n);

        term = term + sumGeom(term * ratio, ratio, n-1);

        System.out.println("term : "+ term + " ");

        System.out.println("ratio : "+ ratio + " ");

        System.out.println("n : " + n);

        return term;
    }
}

//Result will be this
term : 2.0 
ratio : 2.0 
n : 5
term : 4.0 
ratio : 2.0 
n : 4
term : 8.0 
ratio : 2.0 
n : 3
term : 16.0 
ratio : 2.0 
n : 2
term : 32.0 
ratio : 2.0 
n : 1
term : 48.0 
ratio : 2.0 
n : 2
term : 56.0 
ratio : 2.0 
n : 3
term : 60.0 
ratio : 2.0 
n : 4
term : 62.0 
ratio : 2.0 
n : 5
result : 62.00000