8月1日学习总结:
本次学习主要为函数的递归:
递归主要分为三个方面:
(1)什么是递归?
程序调用自身的编程技巧称为递归,递归的主要思考方法在于:把大事化小
示例1:输入一个整数值(无符号),按照顺序打印它的每一位
相关知识点补充:%d打印有符合整数(有正负数) %u打印无符号整数
(2)递归的两个必要条件 当函数调用自身时,容易出现栈溢出:每次函数调用都会在栈区中申请空间,当空间申请过多超过栈区可用空间时就会栈溢出,这时就需要递归的两个条件来约束: ①存在限制条件,当满足这个限制条件的时候,递归将不再继续。 ②每次递归调用后越来越接近这个限制条件。 (如何其中一个不满足时,会出现栈溢出的错误)
示例2:编写函数不允许创建临时变量,求字符串长度(模拟strlen函数)
(3)递归与迭代(非递归)
示例3:求n的阶乘(不考虑溢出)
示例4:求第n个斐波那契数
斐波那契数规则:f(n)
1.n = 1, 2时,f(n) = 1;
2.n > 2时,f(n) = f(n - 1) + f(n - 2);
但是这个函数在使用时会出现一个问题——数过大时返回速度较慢且返回值不准确
当用递归时出现死循环或是(死递归)一直开辟栈空间最终产生栈空间耗尽的情况,也就是栈溢出,如何解决?
a.将递归改成非递归(迭代)
b.使用static对象代替nonstatic局部对象,可以减少每次递归调用和返回时产生和释放nonstatic对象的开销,且static对象可以保存递归调用的中间状态为各个调用层所用。