处理Fibonacci /序列代码

时间:2014-02-06 00:48:00

标签: c fibonacci

我正在编写一个代码来计算序列:

           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;
}

4 个答案:

答案 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-1n-2调用下一级递归的原因也很简单,请注意:
a(n+2)=-2(n+1)+3a(n) - &gt;将n替换为n-2 - &gt; a(n)=-2(n-1)+3a(n-2)