在C中使用递归的斐波那契序列

时间:2018-11-28 20:40:57

标签: c

我正在尝试(但失败)使用递归打印斐波那契序列。我确信这是非常基本的,但是我似乎无法理解。 请告诉我我在做什么错,谢谢!

#include <stdio.h>

int fib(int a, int i)
{
    int nextnum, num1 = nextnum - 1, num2 = nextnum - 2;
    for (i = 0; i >= a; i++) {
        nextnum = num1 + num2;
        printf("%d", nextnum);
        i++;
        fib(a, i);
    }
}

int main(void)
{
    int a, i = 0;

    printf("Enter a number for fib series: ");
    scanf("%d", &a);

    if (a == 1 || a == 2) {
        printf("Enter higher number please!\n");
    }
    else {
        fib(a, i);
    }
}

2 个答案:

答案 0 :(得分:2)

斐波纳契数通常被用作递归的介绍,因为它们是自然递归的。实际上,以任何语言递归地实现它们都是微不足道的。附带说明,通常不是出于实际目的实施斐波那契数列的最佳方法。

根据定义,Fib(X)= Fib(X-1)+ Fib(X-2)。这是递归。唯一缺少的是我们如何停止递归,并且我们知道Fib(0)与Fib(1)相同且为1。

我们如何将其翻译为C语言?非常简单,几乎是一对一的映射!

unsigned int fib(unsigned int k) {
    // First, check our exit (stop) conditions:
    if (k == 0 || k == 1) return 1;

    // Now recursive part  
    return fib(k - 1) + fib(k - 2);
}

答案 1 :(得分:1)

几乎每个递归函数都包含两部分:特定部分,然后是递归部分。

因此要编写此函数,您的算法将如下所示

 if (condition_separate_particular_part) 
    {
        //here the code for part
    }
else 
    {
         //the recursive part 
    }

现在要确定递归部分,您将尝试找到如何使用其前身元素“ i-1”,“ i-2” ...来解释元素“ i”。

像这样,每次您都会很容易。

请注意,有时候找到开始迭代的方式对自己轻松很有用。

我很确定你是新来的,所以这就是为什么你感到迷路了。但是相信我,如果您多运动,很快就会养成习惯。试试看,你会看到的。 ;)。

如果您在查找更多练习/示例时遇到困难,请告诉我。我会尽力帮助您:)。

Here是和示例。只需在C上键入带有用于递归函数的解决方案的“锻炼”,您就会发现有很多要锻炼的;)。

现在这里既是递归代码又是迭代代码

递归

 int fib(int n){
      if (n < 2) // here is particular case
        return n;
      else  // here is the recursion 
        return fib(n-1) + fib(n-2);
    }

printf("%d\n", fib(10));

迭代

int fib(int n) {
  int first = 0, second = 1;

  int tmp;
  while (n--) {
    tmp = first+second;
    first = second;
    second = tmp;
  }
  return first;
}