代码之家  ›  专栏  ›  技术社区  ›  user9181740

幂级数和阶乘级数和的解释

  •  0
  • user9181740  · 技术社区  · 7 年前

    问题:

    SeriesSum类用于计算以下系列的总和:

    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):使用 递归技术。

    void calculate():通过调用 递归函数

    void display():显示系列的总和

    (a) 指定类SeriesSum,提供构造函数的详细信息(int,int), double findfact(int)、double findpower(int,int)、void calculate()和 无效显示()。

    定义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();
        }
    }
    

    我的问题:

    我很难理解,当I=任何奇数(这里以3为例)时,通过findfact的值是(I-1)=2,那么我如何得到奇数阶乘,如3!

    任何帮助或指导都将不胜感激。

    可选:

    如果您能够以某种方式解释findpower和findfactorial中发生的递归,这将非常有帮助。

    4 回复  |  直到 7 年前
        1
  •  1
  •   ttzn    7 年前

    仔细查看循环。 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 .

    顺便说一句,虽然递归可能对教学有所帮助,但它对于计算阶乘或幂是一个糟糕的想法。

        2
  •  0
  •   Ajit Kamble    7 年前

    尝试运行下面的代码,它将消除您的所有疑虑(我修改了一些访问说明符并创建了main方法)

    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
  •   Dmitrii Bychenko    7 年前

    您可以简化求和,并 摆脱 幂和阶乘。请注意:

    1. 第一学期 x * x
    2. 如果你知道这个术语 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;
    }
    
        4
  •  0
  •   Morchul drojokef    7 年前

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

    当我=任何奇数时,我在理解上有问题

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

    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

    我们测试:如果a<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 else调用 findpower() 具有 a, b-1 并乘以 findpower() 具有

    所以最后一个调用的findpower()将返回 1 (b=0)
    第二个findpower()将返回 a * 1 (b=1)
    第三个findpower()将返回 a * a * 1 (b=2)

    可以看到findpower(a,2)=a*a*1=a^2

    希望我能帮助你