我正在编写一个代码来计算序列:
a(n+2)=-2(n+1)+3a(n) a(0)=2 a(1)= -1
不幸的是我无法理解。我最近刚接触这个(大约一个月),我会尽力做到这一点,但我需要一些帮助。谢谢你决定帮助我的人。
#include <stdio.h>
int mysequence(int n)
{
if (n==0) return 2;
if (n==1) return -1;
if (n==2) return 8;
return (2 * mysequence(n+1) + mysequence(n+2))/3;
}
int main()
{
int n;
printf("Enter n = ");
scanf("%d", &n);
printf("%d\n",mysequence(n));
return 0;
}
答案 0 :(得分:1)
我不确定你是怎么想出这一行的:
return (2 * mysequence(n+1) + mysequence(n+2))/3;
但这不正确。首先,mysequence(n)
会调用mysequence(n+1)
(和mysequence(n+2)
),这会调用mysequence(n+2)
,这会调用mysequence(n+3)
,这会调用mysequence(n+4)
等等 - 应该很容易看出你永远不会达到mysequence(0)
或mysequence(1)
(假设为n > 1
),因此它会永远持续下去,或者至少在你跑步之前内存不足,因为你在后续调用中增加而不是减少参数。
让我们从头开始首先转换它:
a(n+2) = -2a(n+1) + 3a(n)
看起来更像代码:(通过从每个n+c
减去2)
(在左侧我们想要a(n)
,因为该函数采用参数n
,而不是n+2
)
a(n) = -2a(n-1) + 3a(n-2)
现在我们只需要将它放在代码中。替换:
return (2 * mysequence(n+1) + mysequence(n+2))/3;
使用
return -2 * mysequence(n-1) + 3 * mysequence(n-2);
此外,您并不需要专门为n == 2
提供服务 - 上述声明将正确处理。
答案 1 :(得分:1)
运行程序时, n 会更大,直到无限数量。
我认为您需要将功能更改为:
a(n)=-2(n-1)+3a(n-2) a(0)=2 a(1)= -1
将 n + 2 替换为 n 。它会使 n 更小,直到1和0。
然后代码将是:
int mysequence(int n)
{
if (n == 0) return 2;
if (n == 1) return -1;
return (-2 * mysequence(n - 1) + mysequence(n - 2)) / 3;
}
注意:n&gt; = 0
答案 2 :(得分:0)
你的递归函数是无限的!传入的n的值在递归调用中递增,但递归的基本情况假设它们减少。
你需要所谓的变量变化。设m = n + 2.所以n = m - 2.然后你给出的重复变为
a(m) = -2 * (m - 1) + 3 * a(m - 2)
将其实现为递归函数。由于在右侧作为参数传递的值现在 less 比左侧的值小,因此对于任何m> = 0,将达到小的基本情况值。
答案 3 :(得分:0)
仔细查看return (2 * mysequence(n+1) + mysequence(n+2))/3
行,并将其与您对序列的了解进行比较:
a(n+2)=-2(n+1)+3a(n)
。
他们没有任何共同点。
你想要的是return (-2*mysequence(n-1) + 3*mysequence(n-2))
。
至于为什么,系数应该足够清楚,它们只是从定义中复制而来。我们使用n-1
和n-2
调用下一级递归的原因也很简单,请注意:
a(n+2)=-2(n+1)+3a(n)
- &gt;将n
替换为n-2
- &gt; a(n)=-2(n-1)+3a(n-2)
。