本文目录
- Python中递归函数的边界设置时什么意思
- 如何理解python中的递归函数
- Python3:怎么通过递归函数
- python 递归函数可视化
- Python递归和循环的区别
- Python 递归函数基例
- python中递归函数写法
Python中递归函数的边界设置时什么意思
就是递归到什么时候该停下来。
比如斐波那契数列,1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n》=2,n∈N*)。
可以看到他的规律为,第N个数的值为第N-1和第N-2个数的值之和。比如要求F(10),得先求F(9)和F(8),要求F(9)得先求F(8)和F(7)……如此递归下去,但是F(1)和F(2)的值始终是1,那n=1或者n=2就可以作为递归的终止条件。
def fib(n): if n《=2 : return 1 else: return fib(n-1)+fib(n-2)
如何理解python中的递归函数
递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。计算机科学家尼克劳斯·维尔特如此描述递归:递归的强大之处在于它允许用户用有限的语句描述无限的对象。因此,在计算机科学中,递归可以被用来描述无限步的运算,尽管描述运算的程序是有限的。python 2 递归函数和其它语言,基本没有差别,只是不支持尾递归。无限递归最大值为固定的,但可以修改。作者:黄哥
Python3:怎么通过递归函数
函数的递归调用递归问题是一个说简单也简单,说难也有点难理解的问题.我想非常有必要对其做一个总结.首先理解一下递归的定义,递归就是直接或间接的调用自身.而至于什么时候要用到递归,递归和非递归又有那些区别?又是一个不太容易掌握的问题,更难的是对于递归调用的理解.下面我们就从程序+图形的角度对递归做一个全面的阐述.我们从常见到的递归问题开始:1 阶层函数#include 《iostream》using namespace std;int factorial(int n){if (n == 0){return 1;}else{int result = factorial(n-1);return n * result;}}int main(){int x = factorial(3);cout 《《 x 《《 endl;return 0;}这是一个递归求阶层函数的实现。很多朋友只是知道该这么实现的,也清楚它是通过不断的递归调用求出的结果.但他们有些不清楚中间发生了些什么.下面我们用图对此做一个清楚的流程:根据上面这个图,大家可以很清楚的看出来这个函数的执行流程。我们的阶层函数factorial被调用了4次.并且我们可以看出在调用后面的调用中,前面的调用并不退出。他们同时存在内存中。可见这是一件很浪费资源的事情。我们该次的参数是3.如果我们传递10000呢。那结果就可想而知了.肯定是溢出了.就用int型来接收结果别说10000,100就会产生溢出.即使不溢出我想那肯定也是见很浪费资源的事情.我们可以做一个粗略的估计:每次函数调用就单变量所需的内存为:两个int型变量.n和result.在32位机器上占8B.那么10000就需要10001次函数调用.共需10001*8/1024 = 78KB.这只是变量所需的内存空间.其它的函数调用时函数入口地址等仍也需要占用内存空间。可见递归调用产生了一个不小的开销.2 斐波那契数列int Fib(int n){if (n 《= 1){return n;}else{return Fib(n-1) + Fib(n-2);}}这个函数递归与上面的那个有些不同.每次调用函数都会引起另外两次的调用.最后将结果逐级返回.我们可以看出这个递归函数同样在调用后买的函数时,前面的不退出而是在等待后面的结果,最后求出总结果。这就是递归.3#include 《iostream》using namespace std;void recursiveFunction1(int num){if (num 《 5){cout 《《 num 《《 endl;recursiveFunction1(num+1);}}void recursiveFunction2(int num){if (num 《 5){recursiveFunction2(num+1);cout 《《 num 《《 endl;}}int main(){recursiveFunction1(0);recursiveFunction2(0);return 0;}运行结果:0123443210该程序中有两个递归函数。传递同样的参数,但他们的输出结果刚好相反。理解这两个函数的调用过程可以很好的帮助我们理解递归:我想能够把上面三个函数的递归调用过程理解了,你已经把递归调用理解的差不多了.并且从上面的递归调用中我们可以总结出递归的一个规律:他是逐级的调用,而在函数结束的时候是从最后面往前反序的结束.这种方式是很占用资源,也很费时的。但是有的时候使用递归写出来的程序很容易理解,很易读.为什么使用递归:1 有时候使用递归写出来的程序很容易理解,很易读.2 有些问题只有递归能够解决.非递归的方法无法实现.如:汉诺塔.递归的条件:并不是说所有的问题都可以使用递归解决,他必须的满足一定的条件。即有一个出口点.也就是说当满足一定条件时,程序可以结束,从而完成递归调用,否则就陷入了无限的递归调用之中了.并且这个条件还要是可达到的.递归有哪些优点:易读,容易理解,代码一般比较短.递归有哪些缺点:占用内存资源多,费时,效率低下.因此在我们写程序的时候不要轻易的使用递归,虽然他有他的优点,但是我们要在易读性和空间,效率上多做权衡.一般情况下我们还是使用非递归的方法解决问题.若一个算法非递归解法非常难于理解。我们使用递归也未尝不可.如:二叉树的遍历算法.非递归的算法很难与理解.而相比递归算法就容易理解很多.对于递归调用的问题,我们在前一段时间写图形学程序时,其中有一个四连同填充算法就是使用递归的方法。结果当要填充的图形稍微大一些时,程序就自动关闭了.这不是一个人的问题,所有人写出来的都是这个问题.当时我们给与的解释就是堆栈溢出。就多次递归调用占用太多的内存资源致使堆栈溢出,程序没有内存资源执行下去,从而被操作系统强制关闭了.这是一个真真切切的例子。所以我们在使用递归的时候需要权衡再三.
python 递归函数可视化
参考一下第一步:简单实现装饰器 def login(func): print(“in Login“) return func def tv(name): print(“{name} in TV“.format(name = name)) tv = login(tv) tv(’Jack’) # out: # in Login # Jack in TV 第二步:同上 效果相同,但是使用的是@login def login(func): print(“in Login“) return func @login def tv(name): print(“{name} in TV“.format(name = name)) #tv = login(tv) tv(’Jack’) # out: # in Login # Jack in TV 但是出现问题,注销最后的执行语句仍有输出,原因在于@login的调用,即@login相当于执行了tv = login(tv) 所以才有输出。 def login(func): print(“in Login“) return func @login def tv(name): print(“{name} in TV“.format(name = name)) #tv = login(tv) #tv(’Jack’) # out: # in Login 如下调整可解决 def login(func): def inner(arg): print(“in Login“) # return func func(arg) return inner @login def tv(name): print(“{name} in TV“.format(name = name)) #tv = login(tv) tv(’Jack’) # out: # in Login # Jack in TV 简单的递归函数 #!/usr/bin/env python #递归函数 def calc(num): print(“Number:“,num) if num/2 》 1: calc(num/2) print(“After Number:“,num/2) calc(10) # Number: 10 # Number: 5.0 # Number: 2.5 # Number: 1.25 # After Number: 1.25 # After Number: 2.5 # After Number: 5.0 递归实现斐波那契数列 # Fibonacci sequence # F[n]=F[n-1]+F[n-2](n》=2,F=1,F=1) # 斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... fibList = [1,1] def getFib(fibList): print(fibList) if fibList + fibList 《 300: fibList.append(fibList + fibList) getFib(fibList) pass pass getFib(fibList) print(“[FINAL]:“,fibList) # [1, 1] # [1, 1, 2] # [1, 1, 2, 3] # [1, 1, 2, 3, 5] # [1, 1, 2, 3, 5, 8] # [1, 1, 2, 3, 5, 8, 13] # [1, 1, 2, 3, 5, 8, 13, 21] # [1, 1, 2, 3, 5, 8, 13, 21, 34] # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] # [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233] # [FINAL]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
Python递归和循环的区别
如果一个函数在内部调用自己,就是递归函数。比如从1加到100,这个digui函数中引用了digui(n + 1)。
def digui(n): if n == 100: return n return n + digui(n + 1)print(digui(1))
循环在哪里都可以,也可以不涉及函数,也可以在函数内部,比如从1打印到100。
x=1while x《100: x=x+1 print(x)
这两个东西,主要是根据需要应用。
Python 递归函数基例
所谓基例就是不需要递归就能求解的,一般来说是问题的最小规模下的解。例如:斐波那契数列递归,f(n) = f(n-1) + f(n-2),基例是1和2,f(1)和f(2)结果都是1再比如:汉诺塔递归,基例就是1个盘子的情况,只需移动一次,无需递归递归必须有基例,否则就是无法退出的递归,不能求解。
python中递归函数写法
def factorial(n):if n《0:return ’负数不可以阶乘’if n==1 or n==0:return 1return n*factorial(n-1)print(factorial(10))函数体里 调用 函数本身 就行