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