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