• 『C语言』递归思想


    Hello🥂謓泽👋多多指教😛

    HY点赞👍收藏⭐️留言📝​

    🉑相关文章【C语言】卍字通晓→函数+递归_謓泽的博客-CSDN博客

    递归思想

    递归的本质就是二字⇢套娃。

    什么被称之为是递归呢⇢在函数里面调用自身函数就被称之为是递归。

    套娃实际上就是在函数中再次调用同样的函数。

    以上便是递归的核心理念了,当你知道这个不知道这个核心理念有没有完整的刻在你的脑海当中去。

    在编程语言当中我们知道-一个函数是可以调用另一个函数的,那么有个特例如下👇

    如果函数调用了自己,我们便把函数在运行的时候调用自己的情况叫做是递归。

    下面我们用一个简单的例子来进行下说明吧。

    那么我们现在假设分析下f(3)当中的结果到底是什么如下↓

    ⒈⇢当参数x的值等于③的时候,开始进入这个函数。此时这个函数返回值是 ③ + f(②)

    注:把x的值给带入到f()函数当中去,尽管返回值的参数是不一样的。也一样带进去即可。

    杰斯⇥那么我们知道③是一个确定的数值,那么f(②)它是一个不确定的值又会等于多少。

    ⒉⇢当函数的参数为②的时候,它的返回值就是 ② + f(①)

    ⒊⇢以此类推下去,参数x值为①的时候,函数的返回值就是 ① + f(0)

    在上述的代码中我们可以知道没有判断条件,这种调用是永远都不会停止的。所以,我们需要在函数当中加入一个判断语句,决定何时停止调用自己。代码示例如下↓

    f(3) = 3 + f(2) = 3 + 2 + f(1) = 3 + 2 + 1 + f(0) = 3 + 2 + 1 + 0 = 6 || 1+2+3=6

    想必当你看完上述对递归的讲解,相信你已经大致明白了递归的大致思想了。那么接下来我们就来用递归做一道sum求1+2...100的求和。

    『递归』⇢ 计算1加到100结果

    示例代码如下↓

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. int f(x)
    4. {
    5. if (x == 0)
    6. return 0;
    7. else
    8. return x + f(x - 1);
    9. }
    10. int main(void)
    11. {
    12. int sum = f(100);
    13. printf("sum = %d\n", sum);
    14. return 0;
    15. }

    运行结果🖊

    sum = 5050

    🍏代码解析⇢在这里我们只需要把f(x)当中上述的3改成100就可以了。

    f(100) = 100+f(99) = 100+99+f(98).....f(0) = 100+99+98+....+0 = 5050 || 0+...1+2+3...=5050

    注:return x + f(x-1) 返回结果会返回到 f(x) 当中,第一次 x = 100 f(x-1) = 99 返回到 f(x) 当中运算符("+") 100 + 99 此时,f(x) = 199 + f(98) 依次循环执行,直到最终x==0的时候便停止调用。

    递归⒉条件

    ⒈存在限制条件,当满足这个限制条件之后的时候,递归便会不再继续。

    ⒉每次递归调用之后都会越来越接近这个限制条件。

    递归递归有递就有归,只递不归会导致程序崩溃。为了避免递归一定是要包含条件语句的。

    栈(stack)

    在执行函数的时候,函数内部局部变量的存储单元都是可以在栈上进行创建的,函数执行结束的时候这些存储单元会被自动的进行释放。栈区主要存放运行函数所分配的局部变量,函数的参数,返回数据,返回地址等。

    提醒→递归是必须要存在着限制条件的,不然堆栈当中就会产生栈溢出。在程序运行的时候,调用函数是有代价的,那就是需要占用一片叫做栈(stack)的内存空间。当调用函数的时候,都必须要存放到一些数据到栈里面去。

    当函数运行结束的时候这些数据会从栈里面被取出,当函数运行结束的时候这些数据会从栈里面被取出。那么我们知道如果调用了很多函数但是这些函数都不会被返回的,那么栈就会被塞满了,数据就没有地方存放了,这种情况就叫做栈溢出的错误。对于程序员来说这是一共非常致命的问题,因此程序会被操作系统强行终止的。

    『递归』⇢ 计算⒊的阶层

    示例代码如下↓

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. int f(x)
    4. {
    5. if (x <= 1)
    6. return 1;
    7. //return x;
    8. else
    9. return x * f(x - 1);
    10. }
    11. int main(void)
    12. {
    13. int sum = f(3);
    14. printf("sum = %d\n", sum);
    15. return 0;
    16. }

    运行结果🖊

    sum = 6

    🍏代码解析⇢是不是发现和上述计算1加到100结果和这道题目是做法非常类似的,只不过改变了调用的运算符,以及限制条件。

    f(3) = 3 * f(2) = 3 * 2 * (1) = 3 * 2 * 1 = 6 || 1 * 2 * 3 = 6

    📝拓展知识点如下👇

    写代码的时候如何在什么情况下使用递归?

    🍊说明⇢如果你的这个功能实现用递归非常容易的话、非常简单、代码量还少、理解起来容易、而且并不存在什么缺陷。那么这种情况你就可以使用递归了。但是,如果你用递归写起来是非常简单,但是还是有明显的缺陷。那么这里不推荐使用递归的方法,典型的例子[斐波那契数列]

  • 相关阅读:
    UM Company区块链游戏登场全球 元宇宙场景再获国际关注
    github访问不进去,浏览器证书不安全,访问失败,证书失效,证书颁发者为VMware,谷歌浏览器小bug
    3559. 围圈报数
    图神经网络 | Python基于图卷积的U-Net架构进行交通流量和速度的预测
    托盘四向车货架|海格里斯如何保证托盘四向穿梭车货架系统可以高效运转?
    2022华为机试真题 C++ 实现【求字符串中所有整数的最小和】
    分布式数据库有哪些特点
    领域驱动设计——柔性设计
    竖曲线全线计算
    Vue+Element 仿飞书表格||甘特图表格 ,搜索、筛选、字段管理、卡片管理功能
  • 原文地址:https://blog.csdn.net/weixin_52632755/article/details/124734334