本博客所有文章采用的授权方式为 自由转载-非商用-非衍生-保持署名 ,转载请务必注明出处,谢谢。
声明:
本博客欢迎转发,但请保留原作者信息!
新浪微博:@iuskye;
Github:@iuskye;
内容系本人学习、研究和总结,如有雷同,实属荣幸!
注:为了学习python,照着刘江老师的教程作了一遍笔记,感谢刘江老师!来源
我们在前面的章节中,很多次的看到了在函数中调用别的函数的情况,如果一个函数在内部调用了自身,这个函数就被称为递归函数。
高斯求和:
但如果使用递归函数来写:
分析一下代码:
当n小于0的时候,直接给出和值为0,当n大于0时,结果是n加上sum_number(n-1)。这里的sum_number(n-1)又是一次sum_number函数的调用,不过参数的值变成了n-1,要得到sum_number(n)的值必须等待sum_number(n-1)的值被计算出来,同样要得到sum_number(n-1)的值必须等待sum_number(n-2)的值,如此一路推算下去,直到sum_number(0),因为if语句的存在,它不需要等待sum_number(-1)的计算了,而是直接给出结果0。然后程序一路返回,直到回到最初的sum_number(n),并给出最终结果。
核心思想:
每一次递归,整体问题都要比原来减小,并且递归到一定层次时,要能直接给出结果。
每一个递归程序都要遵循相同的基本步骤:
初始化算法,递归程序通常需要一个开始时使用的种子值,可以向函数传递参数,或者提供一个入口函数,这个函数时非递归的,但可以为递归计算设置种子值;
检查要处理的当前值是否已经与基本条件相匹配,如果匹配,则进行处理并返回值;
使用更小的或更简单的子问题(或多个子问题)来重新定义答案;
对子问题运行算法;
将结果合并入答案的表达式;
返回结果。
例如:
使用递归函数需要注意递归深度溢出,在Python中,通常情况下,这个深度是1000层,超过将抛出异常。在计算机中,函数递归调用是通过栈(stack)这种数据结构实现的,每当进入一个递归时,栈就会加一层,每当函数返回一层,栈就会减一层。由于栈的大小不是无限的,所以递归调用的次数过多,会导致栈溢出。