Linux C语言 27-递归

Linux C语言 27-递归

本节关键字:C语言 递归

相关C库函数:main、printf

什么是递归?

在C语言中,程序调用自身的编程技巧称为递归(recursion)。递归从字面上可以理解为"递去+归来"。

使用递归的优缺点

使用递归的目的就是实现代码量的简化。

优点:代码量少,递归策略只需要少量的代码就可以完成过次重复计算,大大减少了程序的代码量。

缺点:运行效率低,递归算法在运行效率上比普通的循环要低。

递归算法的使用示例

####递归示例一:十进制正整数转二进制数

题目:请使用C语言中的递归来实现十进制正整数转换为二进制数。

c 复制代码
// 题目:请使用C语言中的递归来实现十进制正整数转换为二进制数。
#include <stdio.h>

void toBinaryEx(int num)
{
    if (num == 0) // 终止条件
        return;
     
    toBinaryEx(num / 2);
    printf("%d", num%2);    
}

void toBinary(int num)
{
    printf("the binary of %-4d is: ", num);
    toBinaryEx(num);
    printf("\n");
}

int main(int argc, char *argv[])
{   
    int i;
    
    for (i=1; i<=20; i++)
        toBinary(i);
    
    return 0;
}


/** 运行结果:
the binary of 1    is: 1
the binary of 2    is: 10
the binary of 3    is: 11
the binary of 4    is: 100
the binary of 5    is: 101
the binary of 6    is: 110
the binary of 7    is: 111
the binary of 8    is: 1000
the binary of 9    is: 1001
the binary of 10   is: 1010
the binary of 11   is: 1011
the binary of 12   is: 1100
the binary of 13   is: 1101
the binary of 14   is: 1110
the binary of 15   is: 1111
the binary of 16   is: 10000
the binary of 17   is: 10001
the binary of 18   is: 10010
the binary of 19   is: 10011
the binary of 20   is: 10100
*/

/** 解析示例:十进制正整数9转换为二进制数的实际运算过程
toBinary(9)                                    printf("%d", 9%2); 1
    toBinary(4)                            printf("%d", 4%2); 0
        toBinary(2)                    printf("%d", 2%2); 0
            toBinary(1)            printf("%d", 1%2);  1
                toBinary(0)    return
*/
递归示例二:求n的阶乘

题目:请使用C语言中的递归来实现十进制正整数的阶乘。

c 复制代码
// 题目:请使用C语言中的递归来实现十进制正整数的阶乘。
#include <stdio.h>

int factorial(int n)
{
    if (n <= 1)
        return 1;
    
    return n*factorial(n-1);
}
int main(int argc, char *argv[])
{   
    int i;
    
    for (i=1; i<=5; i++)
        printf("%d! = %d\n", i, factorial(i));


        return 0;
}

/** 运行结果:
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
*/
递归示例三:斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,数列的具体内容如下:

0、1、1、2、3、5、8、13、21、34、...

数学递推表示:F(0)=0, F(1)=1, f(n)=F(n-1)+F(n-2) (n≥2, n∈N)

问题:求斐波那契数列的第n项。

c 复制代码
// 问题:求斐波那契数列的第n项。
#include <stdio.h>

int fibonacci(int n)
{
    if (n == 0)
        return 0;
    
    if (n <= 2)
        return 1;
    
    return fibonacci(n-1)+fibonacci(n-2);

}
int main(int argc, char *argv[])
{   
    int i;
    
    for (i=0; i<=20; i++)
        printf("fibonacci(%d)=%d\n", i, fibonacci(i));


        return 0;
}

/** 运行结果:
fibonacci(0)=0
fibonacci(1)=1
fibonacci(2)=1
fibonacci(3)=2
fibonacci(4)=3
fibonacci(5)=5
fibonacci(6)=8
fibonacci(7)=13
fibonacci(8)=21
fibonacci(9)=34
fibonacci(10)=55
fibonacci(11)=89
fibonacci(12)=144
fibonacci(13)=233
fibonacci(14)=377
fibonacci(15)=610
fibonacci(16)=987
fibonacci(17)=1597
fibonacci(18)=2584
fibonacci(19)=4181
fibonacci(20)=6765
*/
相关推荐
星恒随风23 分钟前
Linux网络编程:应用层协议究竟是什么?从网络计算器到TCP Socket抽象基类完整实现
linux·网络·笔记·tcp/ip
晗夜未央30 分钟前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>33 分钟前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
Fuyo_11191 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
努力努力再努力wz1 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua
jktantan1 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..2 小时前
【C语言】猜数字游戏
c语言·算法·游戏
飞浪纪元[FWC–FE]2 小时前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt
Wang's Blog2 小时前
Java 项目实战:交友项目 - 联系人列表
java·开发语言·交友
我命由我123452 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理