目录
1.递归是什么?
1.1 递归的思想:
2.顺序打印⼀个整数的每⼀位
编辑3 迭代
4.求第n个斐波那契数
1.递归是什么?
递归其实是⼀种解决问题的⽅法,在C语⾔中,递归就是函数⾃⼰调⽤⾃⼰。
#include <stdio.h>
int main()
{
    printf("哈哈\n");
    main();//自己调用自己,结果就是死循环打印哈哈
    return 0;
}
1.1 递归的思想:
所以递归的思考⽅式就是把⼤事化⼩的过程。 递归中的递就是递推的意思,归就是回归的意思,接下来慢慢来体会。
计算n的阶乘(不考虑溢出),n的阶乘就是1~n的数字累积相乘。
#include <stdio.h>
 int  func(int n)
{
     if (n == 0)//1的阶乘是0;
         return 1;
     else
         return n * func(n - 1);//套用公式
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int r = func(n);
    printf("%d ", r);
    return 0;
}
 上面图很好的解释了上面代码
上面图很好的解释了上面代码
在C语⾔中每⼀次函数调⽤,都需要为本次函数调⽤在内存的栈区,申请⼀块内存空间来保存函数调 ⽤期间的各种局部变量的值,这块空间被称为运⾏时堆栈,或者函数栈帧。
2.顺序打印⼀个整数的每⼀位
输⼊:1234 输出:1 2 3 4
输⼊:520 输出:5 2 0
这个题⽬,放在我们⾯前,⾸先想到的是,怎么得到这个数的每⼀位呢? 如果n是⼀位数,n的每⼀位就是n⾃⼰ n是超过1位数的话,就得拆分每⼀位 1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4 然后继续对123%10,就得到了3,再除10去掉3,以此类推 不断的 %10 和 /10 操作,直到1234的每⼀位都得到;
#include <stdio.h>
void  Print(int n)
{
    if (n > 9)
        Print(n /10);
    printf("%d ", n % 10);//调用完后才打印
  }
int main()
{
    int n = 0;
    scanf("%d", &n);
    Print(n);   
    return 0;
} 3 迭代
3 迭代
 
#include <stdio.h>
int func(int n)//用迭代的方法写出n的阶乘
{
    int i = 0;
    int ret = 1;
    for (i = 1; i <= n; i++)
    {
        ret *= i;  
    }
    return ret;
}
int  main()
{
    int n = 0;
    scanf("%d", &n);
    int r = func(n);
    printf("%d ", r);
    return 0;
}4.求第n个斐波那契数
看到这公式,很容易诱导我们将代码写成递归的形式

#include <stdio.h>
int func(int n)
{
    if (n <= 2)
        return 1;
    else
        return func(n - 1) + func(n - 2);//这个代码计算比较小的数值还可以,但是到了五十的斐波那契就显得困难了
 }
int main()
{
    int n = 0;
    scanf("%d", &n);
    int r = func(n);
    printf("%d ",r);
    return 0;
}当算到第50个斐波那契数列就显得非常吃力了,那是由于什么原因呢?下面来看一张图就能帮助你理解。

其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计 算,⽽且递归层次越深,冗余计算就会越多
用迭代的方式来写
#include <stdio.h>
int Fib(int n)
{ 
    int a = 1;
    int b = 1;
    int c = 1;
    while (n > 2)
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}
int main()
{
    int n = 0;
    scanf("%d",&n);
    int r = Fib(n);
    printf("%d ", r);
    return 0;
}迭代的⽅式去实现这个代码,效率就要⾼出很多了




















