C语言之函数递归

简介: C语言之函数递归
+关注继续查看

1. 概念


C语言中,函数直接或间接调用函数本身,则该函数称为递归函数。


递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。


递归的主要思考方式在于:把大事化小


2. 递归的两个必要条件


//例子:
void func()
{
    //...
    if(...)
        func();//调用自身
    else
    //...
}

在上面的例子中能够看出,它必须满足以下两个条件:


🍥 在每一次调用自己时,必须是(在某种意义上)更接近于解;

🍥 必须有一个终止处理或计算的限制条件,当满足这个限制条件的时候,递归便不再继续。


🍤实例1:


接收一个整型值(无符号),按照顺序打印他的每一位。

例如:

  输入123,输出1 2 3


非递归:


#include<stdio.h>
int main()
{
    int n=123;
    int a = n / 100;//取百位
    int b = (n / 10)%10;//取十位
    int c = n % 10;//取个位
    //依次输出
    printf("%d %d %d\n", a, b, c);
    return 0;
}

递归:


#include<stdio.h>
void Fun_c(int x)
{
    if (x >9)//限制条件
    {
    Fun_c(x/10);
    }
    printf("%d ", x%10);
}

int main()
{
    int n;
    scanf("%d", &n);
    Fun_c(n);
    return 0;
}

图解:

bcaadeb3b5b12f6d2d4563bf1d5b291f_4e9b1ede04f1448a88fb7b608bd3b177.png


🍤实例2:


编写函数不允许创建临时变量,求字符串的长度。


int Length(char* s)
{
    if (*s == '\0')//限制条件
        return 0;
    else
        return 1 + Length(s + 1);

}

#include<stdio.h>
int main()
{
    char* ch = "iloveC";//字符串结束标志:'\0'
    int len = Length(ch);
    printf("%d", len);
    return 0;
}

第一次 s=“iloveC\0”------5+1

第二次 s=“loveC\0”-----4+1

第三次 s=“oveC\0”----3+1

第四次 s=“veC\0”----2+1 ( 回退)

第五次 s=“eC\0”----1+1

第六次 s=“C\0”----1+0

第七次 s=“\0”-----0


340531fb5b7f9d7e660cd8111b2b1235_5f63b45e54674da2bb8ee40d4a4beccf.png


3. 递归与迭代


3.1 求n的阶乘


b339ac4c06fd602947df14800b9da866_73d7929724764fbab99c67fc81c0f897.png

//递归
#include<stdio.h>
int Fac(int n)
{
    if (n == 1)//限制条件
        return 1;
    else
        return n * Fac(n - 1);
}

int main()
{
    int n;
    scanf("%d", &n);
    int temp = Fac(n);
    printf("%d\n", temp);
    return 0;
}
//迭代
int Fac(int n)
{
    int temp = 1;
    for (int i = 1; i <= n; i++)
    {
        temp = temp * i;
    }
    return temp;
}

#include<stdio.h>
int main()
{
    int n;
    scanf("%d", &n);
    printf("%d\n", Fac(n));
    return 0;
}

3.2 求第n个斐波那契数

1 1 2 3 5 8 13 21…

从第三位开始,后一项等于前两项之和


91dded8cc2410561279dacd511d98cab_0c1f86e13fa4401bad9df6cd57de3cef.png


//递归
#include<stdio.h>
int Fib(int n)
{
    if (n == 1 || n == 2)//限制条件
        return 1;
    else
        return Fib(n - 1) + Fib(n - 2);

}
int main()
{
    int n;
    scanf("%d", &n);
    printf("%d\n", Fib(n));
    return 0;
}
//迭代
#include<stdio.h>
int Fib(int n)
{
    int a = 1;
    int b = 1;
    int c;
    while (n >= 3)
    {
        c = a + b;
        a = b;
        b = c;
        n--;
    }
    return c;
}

int main()
{
    int n;
    scanf("%d", &n);
    printf("%d\n", Fib(n));
    return 0;
}

注:

🍥 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。

🍥 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。

🍥 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。


结束语


递归是函数实现的一个很重要的环节,我们不但要理解,还要掌握,能够熟练使用递归,希望这篇文章能够帮助到你。


相关文章
|
4天前
|
C语言
C语言预处理及宏和函数的区别与各自优劣点的详解(上)
C语言预处理及宏和函数的区别与各自优劣点的详解(上)
|
4天前
|
C语言
C语言预处理及宏和函数的区别与各自优劣点的详解(下)
C语言预处理及宏和函数的区别与各自优劣点的详解(下)
|
4天前
|
C语言
C语言内存函数超详细讲解,干货满满
C语言内存函数超详细讲解,干货满满
|
5天前
|
算法 C语言
C语言 16 指针 模拟排序函数 指针数组笔试题上
C语言 16 指针 模拟排序函数 指针数组笔试题上
5 0
|
5天前
|
存储 C语言
C语言 malloc动态内存分配函数
C语言 malloc动态内存分配函数
9 0
|
5天前
|
编译器 C语言
C语言 4 函数 下
C语言 4 函数 下
11 1
|
5天前
|
编译器 程序员 C语言
C语言 3 函数 上
C语言 3 函数 上
13 1
|
7天前
|
编译器 C语言 C++
深入理解C语言内存函数
深入理解C语言内存函数
26 0
|
8天前
|
编译器 C语言 C++
C语言字符串函数,字符函数,内存操作函数
C语言字符串函数,字符函数,内存操作函数
115 0
|
8天前
|
算法 C语言
你会使用函数的递归和迭代吗?----------C语言函数学习(4)详解
你会使用函数的递归和迭代吗?----------C语言函数学习(4)详解
45 1
相关产品
云迁移中心
推荐文章
更多