python递归函数例子,Python递归算法经典实例
本文中目录递归函数递归实例的特征效率优势
递归函数递归
递归是指当一个函数运行本函数中的调用它自身递归函数时,被反复调用,每次调用都进入一个新的层次。递归函数需要结束条件。
当函数递归继续直到撞墙返回时,墙是结束条件。
所以递归需要两个要素,终止条件和递归关系。
注:
对于递归,每次调用一个函数,计算机都会为该函数分配一个新的空间。也就是说,当被调用的函数返回时,调用函数中的变量仍然是原来的值。否则无法实现反向输出。
示例n # includes dio . hint factorial(intn){ int result;If(n0 )//判断异常({printf))输入错误!\ n ;0;} else if(n==0 n==1){ result=1;//推墙} else {result=阶乘(n-1)* n;))递归关系,这个数和前一个数的关系。}返回结果;(} int main)){ int n=5;//输入数字5,计算5的阶乘printf(" Factorial of % d=% d ",n,Factorial(n));0;}计算5的阶乘时,程序先进行递归,当n=1或n=0时返回1。按back计算退货。可见递归函数需要结束条件。
斐波那契数列斐波那契数列是这样一个数列:
0, 1, 1, 2, 3, 5, 8, 13, 21.这个序列从第三项开始,分别等于前两项之和。
# include stdio . hlongfibonacci(long num)if)num==0 num==1){ return num;} else { returns Fibre Channel(NUM-2)Fibre Channel(NUM-2);}}void main () { long数字;请输入puts“”的正整数;扫描( %LD ,数字);Printf(斐波那契数列的%ld项为:%LD(n),number,斐波那契(number);}
应用题~~ xqdyet为了学好英语,需要每天记单词。第一天请记住一个,第二天记住两个,然后按照顺序,用代码完成。计算第10天开始时xqdyet变成了什么单词。
分析:
墙(结束条件)是“第一天记住一个”
递归关系是“第n天的字数=第n-1天的字数,n’
# includesdio.h/*函数获取字数*/intgetwordnumber(n)if(n==1)){ return 1;//推墙} else { returngetword number(n-1)n;//递归关系} } int main()int num=getword number))10);//得到的单词数是printf(xqdyet10第10天记住的:%d单词。\n ,编号;0;)递归函数的特征:
1.每一级函数调用都有自己的变量,但不复制函数代码。比如计算5的阶乘时,每个递归变量都是不同的。每次调用都会返回,比如计算2.5的阶乘时,每次递归都会返回,进行下一次;3.递归函数中,递归调用前的语句与各类被调用函数的执行顺序相同;4.在递归函数中,递归调用后语句的执行顺序与每个调用函数的执行顺序相反;5.递归函数需要end语句。一句话总结递归:自我调用且有完成状态。
效率系统栈
内存中属于OS空间的区域主要用于:(1)保存中断场景。对于嵌套中断,中断程序的场景信息依次推入系统堆栈,中断返回时逆序弹出。)2)保存操作系统子程序之间相互调用的子程序(函数)的参数、返回值、返回值和局部变量。
用户栈
在用户进程空间的一个区域中,保存了用户进程子程序之间调用的子程序(函数)的参数、返回值、返回值和局部变量。
我们写的递归程序是用户程序,所以使用用户栈。
栈溢出
调用的参数通过堆栈区传递,堆栈区在调用过程中会占用线程的堆栈资源。另一方面,递归调用只有在到达最后一个端点时才能使函数按顺序结束,但在到达最后一个端点之前不会释放占用的堆栈区域。当递归调用过多时,占用的堆栈资源超过最大线程值,堆栈溢出,可能导致程序异常结束。
综上:
调用函数时,每次调用都会保存地址,传递参数等。这是通过递归工作栈实现的。具体来说,每次调用函数本身时保存的内容是局部变量、独立变量、调用函数的地址和返回值。所以如果递归调用n次,分配n个局部变量,n个S形自变量,n个调用函数地址,n个返回值,效率会很低。
优点循环能干的事,递归都能干;递归能干的循环不一定能干代码简洁、清晰、易懂
对我们来说,循环可以解决事情,尽量不要应用递归。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。