Java “我怎么能?”;展开;这种sigma表示法是一种递归方法

Java “我怎么能?”;展开;这种sigma表示法是一种递归方法,java,recursion,Java,Recursion,在我的java编程类中,我们有一个实验室任务(不值得一提)来实现几个递归方法。我已经完成了基于给定递归函数的递归方法,我已经完成了剩余部分的必要阶乘递归方法,这是一个sigma系列,我目前正绞尽脑汁 我们得到以下公式: 我已经写出了s(1)-s(5)的结果(使用我的图形计算器来验证我的答案),但是我很难弄清楚如何正确地实现这个递归过程 我已经建立了一个“西格玛”方法,在我所知的范围内,这个方法是合适的,所以我认为我的“公式”方法有问题。最糟糕的是,这个公式看起来是正确的(就我的想法而言),代码

在我的java编程类中,我们有一个实验室任务(不值得一提)来实现几个递归方法。我已经完成了基于给定递归函数的递归方法,我已经完成了剩余部分的必要阶乘递归方法,这是一个sigma系列,我目前正绞尽脑汁

我们得到以下公式:

我已经写出了s(1)-s(5)的结果(使用我的图形计算器来验证我的答案),但是我很难弄清楚如何正确地实现这个递归过程

我已经建立了一个“西格玛”方法,在我所知的范围内,这个方法是合适的,所以我认为我的“公式”方法有问题。最糟糕的是,这个公式看起来是正确的(就我的想法而言),代码目前陷入了无限循环

// ... Rest of code omitted for brevity
private static double sequence2(int i) {
    if (i <= 0) { return 0; }
    return (sequence2(max - i) - 1) / factorial(i); // max is defined in other code
}
private static double sigma(int n) {
    if (n <= 0) { return 0; }
    return sequence2(n) + sigma(n - 1);
}
private static int factorial(int n) {
    if (n <= 1) { return 1; }
    return n * factorial(n - 1);
}
/。。。为简洁起见,省略了代码的其余部分
专用静态双序列2(int i){

如果(i根据您链接的公式,递归应该是(更改要关联的变量名称):


这将从
S(n-1),S(n-2)…S(1)

以相反的顺序生成序列。与我的老师交谈后,他提供了以下方法作为计算正确值的可接受方法:

static double generateSigmaSequnce(int n) {
    if (n < 1) { return 0; }
    double sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += (generateSigmaSequnce(n - i) - 1) / factorial(i);
    }
    return sum;
静态双生成器GMaseQuance(int n){
如果(n<1){返回0;}
双和=0;

对于(int i=1;i什么是
max
,为什么要将阶乘的乘法改为除法?它应该是除法,这是我最初发布的公式中的一个错误。
max
是用户定义的int(min=1)在调用递归方法之前,这是经过验证的。什么是
i
,您认为
max-i
给了您什么?
max-i
是原始序列定义的给定部分。如果您单击我文章中的链接,它会显示正确的符号,可能比我的文章更清楚。这是不正确的,因为它不会对t求和例如,
n=2
应等于
-5/2
,但在您的示例中,它返回
-2
s(2)
应展开为
(s(2-1)-1)/1!+(s(2-2)-1)/2!
其中
s(1)
展开为
(s(1-1)-1!
,它从
(0-1)/1和
-2)返回
-1
计算
(-1-1)/1+(0-1)/2
并返回
-5/2
@studioKeywi,这也是上面代码所做的。也许你忽略了答案中的sigma部分,我相信它可以保持原样。通过你的
序列2
和我的
sigma
方法,我们可以看到它是如何展开的:
sigma(2)
变成
s2(2)+sigma(1)
s2(2)
变成
(s2(1)-1)/factorial(1)
s2(1)
变成
(s2(0)-1)/factorial(0)
s2(0)
factorial(0)
分别返回
0和
1
返回
1
,因此
s2(2)
返回
-2
(这已经是错误的),但是
sigma(1)
计算
s2(1)+sigma(0)
s2(1)
我们已经显示的是
-1
sigma(0)
返回
0
,所以
sigma(1)
返回
-1
,最后
西格玛(2)
返回
-3
西格玛
正确相加;
序列
本身是错误的。
static double generateSigmaSequnce(int n) {
    if (n < 1) { return 0; }
    double sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += (generateSigmaSequnce(n - i) - 1) / factorial(i);
    }
    return sum;