函数递归简单来讲就是函数自己调用自己。使用函数的递归的必要条件有两个,一是递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续,二是 每次递归调⽤之后越来越接近这个限制条件。举几个例子了解一下递归
1.用函数的递归求正整数n的阶乘
解析
通过分析可知正整数n的阶乘可拆分成n*n-1的阶乘,所以要求n的阶乘,就要求n-1的阶乘,以此类推直到1的阶乘。
回过头来看,此题中的限制条件是n==0,在这个过程中n不断向0接近。
2.顺序打印⼀个整数的每⼀位
解析
比如输入123,则打印1 2 3,根据分析可得打印1 2 3 先打印12的每一位再打印3,打印12可以拆分成打印1再打印2。在此题中我们不断把数字缩小达到我们打印数字每一位的目的。
3:求第n个斐波那契数
根据之前的练习很容易写出结果,但是这样会出现问题,如果输入有一个较大的数字,会发现需要很久才能计算出结果。这说明递归的效率是非常低效的。这是因为
在C语⾔中每⼀次函数调⽤,都要需要为本次函数调⽤在栈区申请⼀块内存空间来保存函数调⽤期间的各种局部变量的值,这块空间被称为运⾏时堆栈,或者函数栈帧。 函数不返回,函数对应的栈帧空间就⼀直占⽤,所以如果函数调⽤中存在递归调⽤的话,每⼀次递归 函数调⽤都会开辟属于⾃⼰的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。 所以如果采⽤函数递归的⽅式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出(stack overflow)的问题。为了高效运行,我们也可以通过迭代的方式解决问题。
完.
标签:函数,递归,打印,空间,阶乘,栈帧 From: https://blog.51cto.com/u_16271810/9164007