C语言:函数递归的学习总结

简单来说函数递归就是函数自己调用自己,演示一下

#include <stdio.h>
int main()
{
    printf("hehe\n");
    main();//main函数中⼜调⽤了main函数
    return 0;
}

这个代码会陷入死递归,致使栈溢出,只作演示帮助理解什么是函数递归。

一、递归的限制条件

递归在书写的时候,有2个必要条件:

(1)递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。

 (2)每次递归调用之后越来越接近这个限制条件。

二、递归举例

1、求n的阶乘

n的阶乘就是n*(n-1)*(n-2)*.....*1,可以定义一个函数fact,将n递减,如果n不为0,那么就返回n*fact(n-1),如果n等于0,那么就返回1,就可以有

#include <stdio.h>
int Fact(int n)
{
    if(n==0)
        return 1;
    else
        return n*Fact(n-1);
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Fact(n);
    printf("%d\n", ret);
    return 0;
}

2、顺序打印⼀个整数的每⼀位

比如   输入:1234  输出:1 2 3 4.

对于这类题目首先要想到n%10得到末位数,n/10得到除去个位数的新数,然后再进行n%10,如此循环下去,但这打印出来的结果是倒序的,如果想要正序打印出来,就要先判断这个数是否大于9,如果大于9那么就递归n/10,并且要打印出n%10,并且打印要在递归条件之后这样才会是正序打印,就可以

void Print(int n)
{
    if(n>9)
    {
        Print(n/10);
    }
    printf("%d ", n%10);
}
int main()
{
    int m = 0;
    scanf("%d", &m);
    Print(m);
    return 0;
}

三、递归与迭代

递归和迭代各有利弊,在分析编程题目时,更容易想出递归的方法,而且描述简洁,但是递归会占用更多内存空间,有可能栈溢出,使性能下降;那么如果不想用递归,就可以用迭代的方法(就是循环),提高效率。

比如要求第n个斐波那契数,用递归的方法,代码如下:

#include<stdio.h
int Fib(int n)
{
    if(n <= 2)
        return 1;
    else
        return Fib(n-1) + Fib(n-2);
}
int main()
{
    int n=0;
    scanf("%d", &n);
    int ret = Fib(n);
    printf("%d\n", ret);
    return 0;
}

其实递归程序会不断的展开,在展开的过程中,我们很容易就能发现,在递归的过程中会有重复计 算,而且递归层次越深,冗余计算就会越多。而如果使用迭代的方法,代码可以这样:

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

迭代的方式去实现这个代码,效率就要⾼出很多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值