C语言初阶(一)

函数递归

什么叫递归

递归是一种解决问题的方法,在c语言中,递归就是函数自己调用自己

递归思想

递归的思考方式就是把大事化小,递是递推,归是回归

递归的限制条件

递归存在限制条件,当满足条件时,递归便不再继续

每次递归调用之后,都会越来越接近限制条件

递归举例

1.求n的阶乘

n!=n*(n-1)!

int Fact()
{    
    if(n==0)
        return 1;
    eles
        return n*Fact(n-1);
}
2.打印一个正数的每一位

输入一个整数,依次打印这个整数的每一位

输入:1234        打印:1 2 3 4

void Print(int n)
{
    if(n>9)
        Print(n/10);
    printf("%d",n%10);
}
int nain()
{
    int n = 0;
    scanf("%d",&n);
    Printf(n);
    return 0;
}
3.青蛙跳台阶

青蛙每次能跳1或2个台阶,跳上n个台阶有几种跳法

跳上n个台阶的跳法可以看成是跳上n-1个台阶的跳法加上跳上n-2个台阶的跳法之和

int Fib(int n)
{
    if(n<=3)
    return n;
    else
    return Fib(n-1)+Fib(n-2);
}
4.汉诺塔问题

同样看成是n个盘子,上面有n-1个盘子,以此类推

递归与迭代

如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出的问题,为了避免这种问题,可以采用迭代的发布方式

比如 计算n的阶乘,也可以是产生1~n的数字累计乘在一起

int Fact(int 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 = Fact(n);
    return 0;
}
举例求第n个斐波那契数

斐波那契数列 1 1 2 3 5 8……

用递归的思想很容易写出代码

int Fib(int n)
{
    if(n<=2)
    {
    return 1;
    }
    else
    return Fib(n-1)+Fib(n-2);
}

但这种写法有大量的重复计算,效率很低,因此要尝试使用迭代的方法

​
int Fib(int n)
{
    int a = 1;
    int b = 1;
    int c = 1;
    while(n>2)
    {
        c = a + b;
        a = b;
        b = c;
//把每次循环数字都往后错一位
        n--;//控制该循环的执行次数,当n=3,执行1次
    }
    return c;
}

​

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值