IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> [C语言]浅谈函数的递归 -> 正文阅读

[C++知识库][C语言]浅谈函数的递归

1、什么是函数的递归:

在百度百科中对函数的递归是这样定义的:编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。

在我看来:递归其实和循环是非常像的,循环是都可以写成递归,递归不一定能写成循环。那么问题就来了,既然这样,为什么还要使用递归呢?其实在对于一些有公式的题目来说,递归方式的代码往往让人看起来简单易懂。很多人在使用递归方式后往往就会爱上这种解决问题的方法。

#include<stdio.h>

int main()
{
	printf("csdn  ");
    main();
	return 0;
}

以上这段代码,虽然是错误方式的递归,但是他确实是一种最简单的递归,main函数自己调用自己,结果是在屏幕上一直打印“csdn”,但是我们会发现,在打印一段时间后程序就停止了,这是因为堆栈溢出了。堆栈的溢出是在递归是常常需要讨论的问题:

堆栈溢出:

对于堆栈的溢出我们可以这样理解:在c语言中,每次调用函数都会在内存堆栈上创建一块空间,而这一块的空间是专门给被调用的这个函数使用,通常这块空间是来存放函数内的临时变量的。但是我们可以想到,内存堆栈上的空间就那么大,如果一直调用函数不停止,那么堆栈空间就没有办法被释放,栈空间耗尽,这样下去就会导致堆栈的溢出。

2、递归的使用与注意点:

知道了这些我们来讨论一下使用函数递归的思想:

递归重要思考问题:将大型复杂项目,层层转换成一个与原问题相似的小问题来解决(大事化小)

递归的时候要注意:1、不要写死递归,得有跳出条件,逼近跳出条件。2、递归层次不可太深。

因为在递归层次太深的时候,堆栈空间任然有被耗尽的可能!

接下来我来推荐两种递归:1、求n个数的阶乘。

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

2、求第n个斐波那契数

首先我们先知道什么是斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, ···,想这样的数列就是斐波那契数列,一个数是前两个数之和。斐波那契数列就是典型的知道公式来求解。

int Fb(int n)
{
    if (n <= 2)
        return 1;
    else
        return (Fb(n - 1) + Fb(n - 2));
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    int ret = Fb(n);

    printf("%d", ret);
    return 0;
}

大家通过代码应该可以看出我们这种方式是通过从后往前求的方式来求解,比如果,我们要求第5个斐波那契数,我们就要知道第三个和第四个斐波那契数,在此我们又要求解第三个和第四个斐波那契数。这样方式效率非常低。再说一种不使用递归的方式。

#include<stdio.h>
int Fb(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 ret = Fb(n);

    printf("%d", ret);
    return 0;
}

以上这样的方式就是使用循环的方式来求解第n个斐波那契数。效率相比递归方式大大提升

在此我没有任何说递归方式不好的意思,可能就是我自己的算法太差劲。对于递归和迭代,我认为是各有利弊,并且我认为递归方式是十分好的。

3、对于递归的总结:

递归的优点:代码简洁,清晰易懂,用循环可以解决的问题使用递归都可以解决!(能很好的锻炼大事化小的解决问题思路)

递归的缺点:因为有较多的递归成型条件,对于刚刚接触的新手来说有点挑战。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 20:56:54  更:2022-10-22 21:00:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 5:22:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码