幂和阶乘序列和解释

时间:2018-02-21 14:59:02

标签: java math recursion series

问题:

ClassSum类旨在计算以下系列的总和:

question

班级名称: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中发生的递归,那将会有很大的帮助。

4 个答案:

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

你可以简化求和和摆脱的权力和阶乘。请注意:

  1. 第一个词只是x * x
  2. 如果您知道字词item == x ** (2 * n) / (2 * n - 1)!,则下一个字词为item * x * x / (2 * n) / (2 * n + 1)
  3. 实现:

    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)

我不确定我是否理解你的问题,但我尽力帮助你。

我在理解当i =任何奇数

时遇到问题

在这段代码中,我永远不会是任何奇数

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

你可以把它想象成一个楼梯,每一次findfact都是一步: enter image description here

我们测试:如果&lt; 2然后返回1,我们再次使用findfact()调用a-1并将afindfact()的结果相乘

没有递归的相同函数:

  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

希望我能帮助你