尾递归 - Java
Tail Recursion - Java
我正在尝试创建一个尾递归的方法并找到方程 (i / 2i + 1
) 的 sum
,其中 i
需要递增 1-10
。我在如何达到基本情况并使递归停止方面遇到了麻烦。
这是我目前拥有的:
public class SumSeries {
public static void main(String[] args) {
System.out.println(sumSeries());
}
public static double sumSeries(){
int i = 10;
if (i == 0)
return 0;
else
return (i / (2 * i + 1));
}
}
我觉得你看起来像这样:
public class SumSeries {
public static void main(String[] args) {
System.out.println(sumSeries(10,0));
}
public static double sumSeries(int i,double result){
if (i == 1)
return result;
else{
double res = result + (i / (double)(2 * i + 1));
return sumSeries(i-1,res);
}
}
}
如果你想要递归,你的方法应该是这样的:
public class SumSeries {
public static void main(String[] args) {
System.out.println(sumSeries());
}
// if you want to keep the argument-less method in main but want to calculate
// the sum from 1 - 10 nevertheless.
public static double sumSeries() {
return sumSeries(10);
}
public static double sumSeries(int i){
if (i == 0) {
return 0;
}
else {
// The cast to double is necessary.
// Else you will do an int-division here and get 0.0 as result.
// Note the invocation of sumSeries here inside sumSeries.
return ((double)i / (2 * i + 1)) + sumSeries(i-1);
}
}
}
如果您正在寻找找到此总和的方法:
(1 / 2*1 + 1) + (2 / 2*2 + 1) + (3 / 2*3 + 1) + ... + i/(2i + 1)
你可以试试这个:
public double sumSeries(int i) {
if (i == 1) { // base case is 1 not 0
return 1/3;
} else {
double s = i / (2.0 * i + 1.0);
return s + sumSeries(i - 1);
}
}
你的方法不是递归的。递归方法需要使用 'himself' 并在特定条件下停止。一个例子:
public static double sumSeries(int x) {
if (x == 0)
return x;
else {
return x + sumSeries(x - 1);
}
对于你的例子,这样的东西会适合:
public static double sumSeries(double x) {
if (x == 0)
return x;
else
return (x / (2 * x + 1)) + sumSeries(x - 1.0);
}
如果我正确理解了你的算法 :) 如果没有,请编辑算法 :)
我正在尝试创建一个尾递归的方法并找到方程 (i / 2i + 1
) 的 sum
,其中 i
需要递增 1-10
。我在如何达到基本情况并使递归停止方面遇到了麻烦。
这是我目前拥有的:
public class SumSeries {
public static void main(String[] args) {
System.out.println(sumSeries());
}
public static double sumSeries(){
int i = 10;
if (i == 0)
return 0;
else
return (i / (2 * i + 1));
}
}
我觉得你看起来像这样:
public class SumSeries {
public static void main(String[] args) {
System.out.println(sumSeries(10,0));
}
public static double sumSeries(int i,double result){
if (i == 1)
return result;
else{
double res = result + (i / (double)(2 * i + 1));
return sumSeries(i-1,res);
}
}
}
如果你想要递归,你的方法应该是这样的:
public class SumSeries {
public static void main(String[] args) {
System.out.println(sumSeries());
}
// if you want to keep the argument-less method in main but want to calculate
// the sum from 1 - 10 nevertheless.
public static double sumSeries() {
return sumSeries(10);
}
public static double sumSeries(int i){
if (i == 0) {
return 0;
}
else {
// The cast to double is necessary.
// Else you will do an int-division here and get 0.0 as result.
// Note the invocation of sumSeries here inside sumSeries.
return ((double)i / (2 * i + 1)) + sumSeries(i-1);
}
}
}
如果您正在寻找找到此总和的方法:
(1 / 2*1 + 1) + (2 / 2*2 + 1) + (3 / 2*3 + 1) + ... + i/(2i + 1)
你可以试试这个:
public double sumSeries(int i) {
if (i == 1) { // base case is 1 not 0
return 1/3;
} else {
double s = i / (2.0 * i + 1.0);
return s + sumSeries(i - 1);
}
}
你的方法不是递归的。递归方法需要使用 'himself' 并在特定条件下停止。一个例子:
public static double sumSeries(int x) {
if (x == 0)
return x;
else {
return x + sumSeries(x - 1);
}
对于你的例子,这样的东西会适合:
public static double sumSeries(double x) {
if (x == 0)
return x;
else
return (x / (2 * x + 1)) + sumSeries(x - 1.0);
}
如果我正确理解了你的算法 :) 如果没有,请编辑算法 :)