问题:
ClassSum类旨在计算以下系列的总和:
班级名称:SeriesSum
数据成员/实例变量:
x:存储整数
n:存储条款数量
sum:用于存储系列之和的双变量
会员职能:
SeriesSum(int xx,int nn):赋值x = xx和n = nn的构造函数
double findfact(int m)使用递归返回m的阶乘 技术
double findpower(int x,int y):使用将x提升到y的幂 递归技术。
void calculate():通过调用计算系列的总和 分别是递归函数
void display():显示系列的总和
(a)指定ClassSum类,给出构造函数的详细信息(int,int), double findfact(int),double findpower(int,int),void calculate()和 void display()。
定义main()函数来创建一个对象并调用 相应的功能以启用任务。
代码:
class SeriesSum
{
int x,n;
double sum;
SeriesSum(int xx,int nn)
{ x=xx;
n=nn;
sum=0.0;
}
double findfact(int a)
{ return (a<2)? 1:a*findfact(a-1);
}
double findpower(int a, int b)
{ return (b==0)? 1:a*findpower(a,b-1);
}
void calculate()
{ for(int i=2;i<=n;i+=2)
sum += findpower(x,i)/findfact(i-1);
}
void display()
{ System.out.println("sum="+ sum);
}
static void main()
{ SeriesSum obj = new SeriesSum(3,8);
obj.calculate();
obj.display();
}
}
MyProblem:
我在理解i =任何奇数时遇到问题(在这里举例如3)然后通过findfact的值是(i-1)= 2然后我如何获得奇数阶乘,如3!
任何帮助或指导都将受到高度赞赏。
可选
如果你能以某种方式解释在findpower和findfactorial中发生的递归,那将会有很大的帮助。
答案 0 :(得分:1)
仔细看看循环。 i
从2开始,每次迭代递增2,所以它永远不会奇怪。它对应于x
的连续幂,每个幂除以i -1
的阶乘(即奇数)。
至于findfact
中的递归,您只需要手动展开前几个调用以查看其工作原理:
findfact(a) = a * findfact(a -1)
= a * (a - 1) * findfact(a -2)
= a * (a - 1) * (a - 2) * findfact(a - 3)
...
= a * (a - 1) * (a - 2) * ... * 2 * findfact(1)
= a * (a - 1) * (a - 2) * ... * 2 * 1
= a!*
同样的推理适用于findpower
。
作为旁注,虽然它可能对教学目的有帮助,但递归对于计算因子或幂是一个可怕的想法。
答案 1 :(得分:0)
你可以简化求和和摆脱的权力和阶乘。请注意:
x * x
item == x ** (2 * n) / (2 * n - 1)!
,则下一个字词为item * x * x / (2 * n) / (2 * n + 1)
。实现:
private static double sum(double x, int count) {
double item = x * x; // First item
double result = item;
for (int i = 1; i <= count; ++i) {
// Next item from previous
item = item * x * x / (2 * i) / (2 * i +1);
result += item;
}
return result;
}
在现实世界中,您可以注意到
sinh(x) = x/1! + x**3/3! + x**5/5! + ... + x**(2*n - 1) / (2*n - 1)! + ...
你的系列只不过是
x * sinh(x) = x**2/1! + x**4 / 3! + ... + x**(2*n) / (2*n - 1)! + ...
所以你可以实现
private static double sum(double x) {
return x * (Math.exp(x) - Math.exp(-x)) / 2.0;
}
答案 2 :(得分:0)
尝试运行下面的代码,它将清除你所有的疑虑(我修改了一些访问说明符并创建了主方法)
public class SeriesSum
{
int x,n;
double sum;
SeriesSum(int xx,int nn)
{ x=xx;
n=nn;
sum=0.0;
}
double findfact(int a)
{ return (a<2)? 1:a*findfact(a-1);
}
double findpower(int a, int b)
{ return (b==0)? 1:a*findpower(a,b-1);
}
void calculate()
{
System.out.println("x ="+x);
System.out.println("n ="+n);
for(int i=2;i<=n;i+=2){
System.out.println(x+"^"+i+"/"+(i-1)+"!" +" = " +(findpower(x,i)+"/"+findfact(i-1)) );
//System.out.println(findpower(x,i)+"/"+findfact(i-1));
sum += findpower(x,i)/findfact(i-1);
}
}
void display()
{ System.out.println("sum="+ sum);
}
public static void main(String arg[])
{ SeriesSum obj = new SeriesSum(3,8);
obj.calculate();
obj.display();
}
}
// ----- output ----
x =3
n =8
3^2/1! = 9.0/1.0
3^4/3! = 81.0/6.0
3^6/5! = 729.0/120.0
3^8/7! = 6561.0/5040.0
sum=29.876785714285713
答案 3 :(得分:0)
我不确定我是否理解你的问题,但我尽力帮助你。
在这段代码中,我永远不会是任何奇数
for(int i=2;i<=n;i+=2)
我将:2,4,6,8等等因为i+=2
更易读的版本中的findfact()函数:
double findfact(int a){
if(a < 2 ){
return 1;
} else {
return a * findfact(a - 1);
}
}
我们测试:如果&lt; 2然后返回1,我们再次使用findfact()
调用a-1
并将a
与findfact()
的结果相乘
没有递归的相同函数:
double findfact(int a){
int sum = 1;
for(int i = a; i > 0; i--){
sum *= i;
}
return sum;
}
findpower函数也是如此:
如果b == 0则返回1,则使用findpower()
调用a, b-1
,并将findpower()
的返回值乘以a
所以最后一次调用findpower()将返回1
(b = 0)
第二个最后一个findpower()将返回a * 1
(b = 1)
第三个findpower()将返回a * a * 1
(b = 2)
所以你可以看到findpower(a,2)= a * a * 1 = a ^ 2
希望我能帮助你