函数的递归

这篇博客深入探讨了递归算法的概念,通过举例说明了如何将复杂问题分解为更小的部分。递归在计算字符串长度、计算斐波那契数列等方面的应用被详细阐述,并对比了递归与迭代的效率。同时,提到了递归可能导致的栈溢出问题,强调了正确设置进入和跳出条件的重要性。博客还讨论了汉诺塔问题和青蛙跳台阶问题,展示了递归在解决递归结构问题的威力。
摘要由CSDN通过智能技术生成
  • 什么是递归算法


    高级数据结构,举个例函数自己调用自己叫递归
    main函数自己调用自己
    死递归,
    死循环,跑着跑着关了,跑死了
    最简单的递归,是不能这样写,但是可以
    最重要思想:把大事化小
  • 例子1:


    1234%10得到各位
    1234/10=123%10=3
    123/10= 12%10 =2
    12/10=1 1%10 = 1
    先模10再除10
    递归的写法:
    unsigned int main = 0;
    print函数可以打印参数部分数字的每一位

    以大化小
    注意要大于九这是隐含条件
    自定义函数
    if(n>9)
    {
    print(n/10);
    ​}
    这里面才是最底层的关键
    这个自定义函数是最难理解的,要对她扣息
    我们把她分解成多份
    五行代码却完成如此多的步骤
    把大事化小
    自己调用自己
    要画图表示出来
    递归在书写的时候很重要

    递归的书写很重要
    递归可以听下来
    if(n>9)很重要
    递归有进入和跳出条件
  • 递归的两个必要条件


    if(n>9)
    133>>13>>1
    这是必要条件

    易错递归
    满足两个条件
    但是这个代码挂了
    出现了栈溢出stack overflow
    举例子:内存使用时
    有三个区域叫栈区 堆区 静态区
    每一个函数调用都要在内存栈区给自己分配一个空间
    调用main函数,有块main函数的栈帧空间
    这个栈帧空间,放给别的空间
    另一块区域给test分配
    teat内存发现又要调用test
    又有一个test函数的空间

    栈区空间的被耗干,会出现栈溢出
    所以在写递归的时候
    1.决不能死递归,就不会跳出条件,每次递归逼近跳出条件
    2.递归的层次不能太深
    www.stackoverflow.com相对程序员的知乎网!
    ​提问回答英文
    hr你知道stackoverflowe吗?
    一定要尝试
    如何思考递归
  • 第二道:!


    求字符串长度: char arr[] = "bit";
    strlen(arr) 求数组arr的数组长度
    心里要清楚这个题目是求字符串长度
    接下来要模拟实现一个strlen函数
    数组名传参要的是首元素的地址,a的地址,字符的地址
    ​字符的地址要放在一个字符指针变量内去

    当我们在这个地方计算长度,返回类型int
    这个时候我们简单分析一下

    这是你数组的内容'a' 'b' 'c' ' \0'
    这个数组叫arr
    现在我们把arr传给my_strlen
    my_strlen拿了一个str指针来接受
    str指针存放的一定是'a'的地址

    str指针指向的字符不断往后走,++直到遇到\0
    +1+1就三
    实现代码

    if(*str ! ='\0')
    {
    count++;
    strl++;
    这个str++很重要,往后走
    我们要用循环把while换if
    ​}
    return count;
    题目要求不允许创建临时变量
    不能有count ,做铺垫
    最普通的解法
    传统方法解决不了
    用递归函数还是原来的函数
    用递归思想来解决
    队友my_strlen("bit")求第一个字符很简单,*str就行了
    可以换成
    啵一个下来,大事化小
    先想明白
    if(*str!='\0')
    return 1 +my_strlen(str+1);
    str+1这个值传过去,就可以指向下一个i的地址
    把i地址传过去
    这个strlen就可以求it的长度+1就是总长度
    如果第一个字符是\0;就是0
    递归难想而且要return的灵活利用
    然后用图表示
    这就是递归的思想!!!!!
    str ++和str +1
    假设str是整形;后加加是先使用再来加加
    ​一个传进去是10一个传进去是11
    讲了;两个方法,一个寄存器一个递归
  • 第三种递归与迭代,迭代就是重复做一件事循环是一种迭代的方式

    • n!


      1*2*3*4*5*6
      ​数学是这样定义的
      int ret = Fac(n);还是利用好return
      有些功能:可以使用迭代的方式来实现,也可以使用递归
  • 第四道
    求第n个斐波那契数
    1 1 2 3 5 8 13 21 34
    • 这个


      直接递归实现
      在干啥,代码一直在跑,效率太低了,原因是进行了重复大量的计算
      你要知道50,你就要知道49 48 47 46
      递归会走四十多层,效率太多
      那就用迭代
      迭代思路:
      通过c = a+b;通过赋值进行往前迁移;
      ​效率非常快
      总结:函数可以用迭代和递归方法
      递归层次太深,栈溢出,效率低下这是缺点
      • 汉诺塔问题


        三个柱子
        A猪 b猪 c 猪
        盘子放在柱子上
        每一次动作相似,递归
        这个过程就是递归
        博客写汉诺塔问题
      • 青蛙跳台阶
        一次可以跳一个或者两个台阶
        问这只青蛙,跳到n个台阶有多少种跳法
        就斐波数列的问题!
        经典的笔试题
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值