首页 > 其他分享 >函数的递归

函数的递归

时间:2024-01-09 18:37:10浏览次数:26  
标签:函数 递归 打印 空间 阶乘 栈帧

函数递归简单来讲就是函数自己调用自己。使用函数的递归的必要条件有两个,一是递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续,二是 每次递归调⽤之后越来越接近这个限制条件。举几个例子了解一下递归

1.用函数的递归求正整数n的阶乘


函数的递归_n的阶乘

解析

函数的递归_n的阶乘_02

函数的递归_函数栈_03

通过分析可知正整数n的阶乘可拆分成n*n-1的阶乘,所以要求n的阶乘,就要求n-1的阶乘,以此类推直到1的阶乘。

回过头来看,此题中的限制条件是n==0,在这个过程中n不断向0接近。

2.顺序打印⼀个整数的每⼀位

函数的递归_函数栈_04

解析

函数的递归_函数栈_05

比如输入123,则打印1 2 3,根据分析可得打印1 2 3 先打印12的每一位再打印3,打印12可以拆分成打印1再打印2。在此题中我们不断把数字缩小达到我们打印数字每一位的目的。

3:求第n个斐波那契数

函数的递归_递归_06

根据之前的练习很容易写出结果,但是这样会出现问题,如果输入有一个较大的数字,会发现需要很久才能计算出结果。这说明递归的效率是非常低效的。这是因为

在C语⾔中每⼀次函数调⽤,都要需要为本次函数调⽤在栈区申请⼀块内存空间来保存函数调⽤期间的各种局部变量的值,这块空间被称为运⾏时堆栈,或者函数栈帧。 函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归 函数调⽤都会开辟属于⾃⼰的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。 所以如果采⽤函数递归的⽅式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出(stack overflow)的问题。为了高效运行,我们也可以通过迭代的方式解决问题。

完.

标签:函数,递归,打印,空间,阶乘,栈帧
From: https://blog.51cto.com/u_16271810/9164007

相关文章

  • 无涯教程-Redis - ZSCAN 命令函数
    RedisZSCAN命令迭代"排序集"类型的元素及其关联的分数。ZSCAN-返回值返回数组。ZSCAN-语法以下是RedisZSCAN命令的基本语法。redis127.0.0.1:6379>ZSCANkeycursor[MATCHpattern][COUNTcount]参考链接https://www.learnfk.com/redis/sorted-sets-zscan.h......
  • SQL中的concat_ws()函数
    CONCAT_WS是SQL中的一个函数,用于连接多个字符串。该函数的全称是"CONCATenateWithSeparator",意味着它会在提供的分隔符的两侧,将多个字符串连接起来。使用场景:拼接多列数据:当你想将多个列的数据合并成一个新的列时,可以使用CONCAT_WS。动态生成字符串:在报告或数据分析中,有......
  • 无涯教程-Redis - ZUNIONSTORE 命令函数
    RedisZUNIONSTORE命令计算由指定键给定的数字键排序集的并集,并将输出存储在目标位置,在传递输入键和其他(可选)参数之前,必须提供输入键(numkey)的数量。ZUNIONSTORE-返回值返回目标中输出排序集中的元素数。ZUNIONSTORE-语法以下是RedisZUNIONSTORE命令的基本语法。......
  • 无涯教程-Redis - ZSCORE 命令函数
    RedisZSCORE命令返回键排序后的元素的得分,如果元素不存在于排序集中,或者键不存在,则返回nil。ZSCORE-返回值返回元素的分数值。ZSCORE-语法以下是RedisZSCORE命令的基本语法。redis127.0.0.1:6379>ZSCOREkeymemberZSCORE-示例redis127.0.0.1:6379>ZADDm......
  • 无涯教程-Redis - ZREMRANGEBYSCORE 命令函数
    RedisZREMRANGEBYSCORE命令删除存储在键中的排序集中的所有元素,这些元素的分数介于最小和最大(含)之间。ZREMRANGEBYSCORE-返回值返回删除的元素数量。ZREMRANGEBYSCORE-语法以下是RedisZREMRANGEBYSCORE命令的基本语法。redis127.0.0.1:6379>ZREMRANGEBYSCORE......
  • 无涯教程-Redis - ZREMRANGEBYRANK 命令函数
    RedisZREMRANGEBYRANK命令删除存储在键中且排序在开始(start)和停止(stop)之间的排序集中的所有元素。ZREMRANGEBYRANK-返回值返回删除的元素数量。ZREMRANGEBYRANK-语法以下是RedisZREMRANGEBYRANK命令的基本语法。redis127.0.0.1:6379>ZREMRANGEBYRANKkeyst......
  • JavaScript apply、call、bind 函数详解
    apply和callapply和call非常类似,都是用于改变函数中this的指向,只是传入的参数不同,等于间接调用一个函数,也等于将这个函数绑定到一个指定的对象上:letname='window'functiongetName(param1,param2){console.log(this.name)console.log(param1,param2)}letobj=......
  • 无涯教程-Redis - ZREM 命令函数
    RedisZREM命令从存储在键(key)处的排序集中删除指定的元素,不存在的元素将被忽略,当键存在且不包含排序集时,将返回错误。ZREM-返回值返回从排序集中删除的元素数,不包括不存在的元素。ZREM-语法以下是RedisZREM命令的基本语法。redis127.0.0.1:6379>ZREMkeymembe......
  • VUE框架的事件绑定与事件回调函数的this对象------VUE框架
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title>......
  • 无涯教程-Redis - ZLEXCOUNT 命令函数
    当以相同的分数插入排序集中的所有元素时,为了强制按字典顺序排序,此命令将返回键中排序集中的元素数,其值介于min和max之间。ZLEXCOUNT-返回值返回指定分数范围内的元素数。ZLEXCOUNT-语法以下是RedisZLEXCOUNT命令的基本语法。redis127.0.0.1:6379>ZLEXCOUNTKEYMI......