函数的递归与迭代

TIPS

1.计算字符串的长度是从第一个字符开始计数,然后碰到\0停止。

2.函数递归虽然可以用数列的递推公式很直观形象的思考,但是又与数列的递推公式有一点区别,就是说一定一定一定一定要有限制条件,一旦没有限制条件就会进入死递归。

3.静态区里面放的是全局变量与静态变量。静态区里面的数据当没有初始化的时候,默认为0,但是局部变量与形式参数必须要初始化,因为如果不初始化,里面放的是随机值。

4.函数的参数可以是常量,变量,表达式,函数,数组等等,函数体里面最好少用全局变量。。

5.函数在return的时候不能返回两个数,只能返回一个数。

6.函数可以传值调用,传值调用的时候,形参是实参的一份临时拷贝。
函数可以传址调用,传址调用的时候可以通过形参操作实参。

7.形参在函数调用的时候才实例化,才开辟内存空间。函数调用如果是传值调用改变形参不影响实参。

8.每个函数的局部变量互相是看不到的,作用域不一样。因此在不同的函数中可以使用相同名字的变量。

9.函数设计应该追求高内聚低耦合,一定要保持相对的独立性,各模块之前尽量独立。尽可能少的使用全局变量(全局变量在工程中到处可以使用,因此不可控)

函数的递归与迭代

1.函数递归首先是假设那个函数功能是成立的,然后把过程A(n)个过程分成A(n-1)过程与其他过程,并且要注意限制条件。

2.函数栈帧:每一次函数调用(就算是不断调用相同的函数,当然调用不同的函数就更加不用说了)都会为本次函数调用分配内存空间,这个内存空间是在内存的栈区上面(这也就是说为什么死递归会导致栈溢出)。
为本次函数调用而分配的内存空间叫做本次函数调用的栈帧空间。
其中函数栈帧的创建和销毁,这个知识非常关键,当一次函数调用完之后,它的栈帧空间就又还给操作系统了。

3.之前说过内存分为栈区,堆区和静态区。每一次函数调用都会为其分配内存空间。比如说上来就一个main()函数,那就会为其分配内存空间,这个内存空间就叫做main()函数的函数栈帧。当然这个分配的内存空间可以变动的,它如果觉得不够的话会找,再来一点,再来一点,再来一点。而这个内存空间里面就会存放main()函数的一些局部变量等等。

4.有时候用递归去解决某些问题的说发现会算的很费劲,比如说求大一点的斐波纳契数,这会很低效。递归有时候并不一定是最好的形式,这时候我们就需要用非递归的形式,也就是说是迭代。有时候用递归的方法写出的一些代码可能会出现问题,比如说递归的层次太深等等。这时候你就要去思考用迭代的方式(所谓迭代,其实也就是说把一件事情不断的重复去做,所以循环就是一种迭代),当如果你用循环去解决问题的时候,就不可能出现栈溢出这个情况,而且效率也会高很多。

5.所谓迭代,就是用非递归的方式去解决问题。

6.如何解决栈溢出的情况:
1. 将递归改写成非递归。
2. 使用static对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代
nonstatic 局部对象(即栈对象),这不
仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保
存递归调用的中间状态,并且可为
各个调用层所访问。

7.提示:
1. 许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更为清晰。
2. 但是这些问题的迭代实现往往比递归实现效率更高,虽然代码的可读性稍微差些。
3. 当一个问题相当复杂,难以用迭代实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

絕知此事要躬行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值