当前位置: 首页 > 知识库问答 >
问题:

幂阶乘级数和解释

龙俭
2023-03-14

问题:

设计了一个系列类,用于计算以下系列的总和:

类名:SeriesSum

数据成员/实例变量:

x:存储整数

n:存储术语数

sum:存储序列和的双变量

成员职能:

SeriesSum(int-xx,int-nn):指定x=xx和n=nn的构造函数

使用递归技术返回΢的阶乘。

double findpower(int x, int y): 使用递归技术将 x 提升为 y 的幂。

void calculate():通过分别调用递归函数来计算序列的和

空显示():显示序列的总和

(a) 指定类 SeriesSum,给出构造函数(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();
    }
}

我的问题是:

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

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

可选:

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

共有3个答案

南门向荣
2023-03-14

你可以简化求和,去掉幂和阶乘。请注意:

  1. 第一个术语就是x*x
  2. 如果您知道术语<code>item==x**(2*n)/(2*n-1)下一个将是项*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;
}
易嘉胜
2023-03-14

尝试在代码下面运行,它会消除您所有的疑虑(我修改了一些访问说明符并创建了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
狄鹏
2023-03-14

仔细看看循环。i从2开始,每次迭代都增加2,所以它从来都不是奇数。它对应于x的连续幂,每个幂都被i-1的阶乘除以(这是奇数)。

至于<code>findfact</code>中的递归,您只需手动展开前几个调用,即可了解其工作原理:

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

作为旁注,尽管递归可能有助于教学,但对于计算阶乘或幂而言,递归是一个糟糕的想法。

 类似资料:
  • 本文向大家介绍Java版超大整数阶乘算法代码详解-10,0000级,包括了Java版超大整数阶乘算法代码详解-10,0000级的使用技巧和注意事项,需要的朋友参考一下 当计算超过20以上的阶乘时,阶乘的结果值往往会很大。一个很小的数字的阶乘结果就可能超过目前个人计算机的整数范围。如果需求很大的阶乘,比如1000以上完全无法用简单的递归方式去解决。在网上我看到很多用C、C++和C#写的一些关于大整数

  • 计算一个数字的阶乘。 使用递归。如果 n 小于或等于 1 ,则返回 1 。否则返回 n 和 n - 1 的阶乘。如果 n 是负数,则会引发异常。 const factorial = n => n < 0 ? (() => { throw new TypeError('Negative numbers are not allowed!'); })()

  • 我怎样才能导入阶乘函数分别从Numpy和sippy为了看看哪一个更快? 我已经通过导入数学从python本身导入了阶乘。但是,它不适用于Numpy和smpy。

  • 问题内容: 我想使用for循环在Java中执行阶乘程序。例如,我想接受用户输入,说,然后相乘。我需要构建循环的帮助。到目前为止,我不知道去哪里。 问题答案: 尝试 正如@Marko Topolnik在评论中提到的那样,该代码将适用于输入最多12的输入。对于较大的输入,由于溢出将输出无穷大。 对于大于12的数字,您应使用更高的数据类型,例如 你可以试试:

  • 我如何使程序执行一个新的或重复的操作,或要求用户再次输入一个数字,并知道它的阶乘。

  • 我刚刚开始编写Haskell,基本上是因为我在寻找一种比C#更强大的数学语言,现在我很困惑。 现在我只想找到4的阶乘,然后打印出来,这是我到目前为止写的: 当我试着调试它时,我得到了 错误:(3,8)ghc:无法匹配预期类型