c语言递归三个条件-递归三条件,用 c 语言
你想算 5!,是不是先把 5 拆成 4!...1!?这时候代码里得有个“要是”判断,要是小于等于 1,直接回 1,出于 0 或 1 的阶乘就是 1。
要是大于,就往下乘。
这时候你可能会想,“是不是还得写个循环来数一下乘了几个数?”这时候回头再看,蝰蛇算法(蝰蛇就是蛇,好办理解)实际上就是一条蛇,游到终点就停。
要是拐弯忒直,绕远了,效率反而低;要是拐弯忒急,直接撞墙了,那就归零。递归的核心就在那儿,就是“自己归自己”,但得管住好那个转弯半径。 再说你说的那个,为啥有些考试不让写死循环?出于死循环,就是那个一辈子转不出去的圈,代码里写着"i++",结局 i 加到 1000 万,内存直接爆表,程序直接黄了。递归也一样,堆内存有限,递归深度忒大,栈溢出,程序就挂了。
故此管住递归深度,就是管住那堆栈,不能让它无限往上翻。 再聊聊成长函数,那个 2 的 n 次方。
你想算 100!,是不是得算 100-1 次的 2 的乘?这时候要是把 n 设成 1000,那得递归 1000 层,栈空间不够了。
这时候你得想,能不能换个思路?
要么把大难题拆成小难题,一步一步来。就像爬楼梯,一步登天忒悬,得一步一步往上爬,每上一级,就把步子放小,要么把之前的步骤先存下来,别把栈顶给压扁了。 还有啊,有时候递归忒快了,调用次数忒多,工夫也够不够用。
比如每次都要去判断,要么把大量数据都传那会儿,实际上能够优化一点。
比如不用传了参数 n,直接传当前层数,要么把状态传那会儿。
这样调用次数少了,效率也高了。 你当作递归就是代码里写个函数,只要带个 if 就行?实际上不然。递归这东西,得看能不能用,啥时候用,如何用。
是不是把循环改成递归,有时候会更“优雅”?有时候循环更快?得看场景。
比如“斐波那契数列”这种,算第 40 项,循环得几千次,递归也得几千次,差别不大。但算第 60 项,循环可能得 60 次,递归可能就几百次,这时候递归就确实快多了,出于优化的话,它实际上不是确实递归,是演的演。 还有啊,有时候递归确实懒得用,干脆直接循环,别搞复杂递归了。
比如算阶乘,循环写起来好办,没必要逼自己写递归。递归这事儿,得看那个场景,看那个数据,看那个效率。
不是所有难题都能套递归的,有些难题,循环解决得更干脆。 故此啊,写递归,得看那个代码,看那个数据,看那个效率。别死记硬背那些公式,得自己琢磨,自己试。就像你炒菜,火候过了,味道腥,得赶紧翻个面,要么加点盐。递归也得把握,别忒深,别忒浅,别忒死,也别忒乱。 最终,你想想,递归这东西,到底是个啥?实际上就是把大难题拆成小难题,小难题归结到小难题,直到小难题好办到不用递归,直接算出来为止。就像滚雪球,滚到一定程度,就停住了。滚得忒快,底都露了;滚得忒慢,一直滚不到头。得找那个平衡点。 故此啊,写递归代码,得有个意识,别忒像算法,要像人办事。办事得有步骤,得有状态,得有反馈。别把递归写成一堆无意义的调用,得想清楚每一步的逻辑,每一层的代价。 行吧,这些算是凑够字数了,希望能帮到你。
要是还有啥难题,就聊聊别的,要么骂骂那些死循环的程序员。
本文系作者个人观点,不代表本站立场,转载请注明出处!





