#递归
是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象。在计算机编程里,递归指的是一个过程:函数不断引用自身,直到引用的对象已知。使用递归解决问题,思路清晰,代码少。但是在主流高级语言中(如C语言、Pascal语言等)使用递归算法要耗用更多的栈空间,所以在堆栈尺寸受限制时(如嵌入式系统或者内核态编程),应避免采用。所有的递归算法都可以改写成与之等价的非递归算法。
(来源于百度,看不懂正常,术语就是不说人话)
###菲波那契数列:
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…数列从第3项开始,每一项都等于前两项之和。
先上代码:
import datetime
def fib(n):
if n <2:
return n
else:
return fib(n -1) + fib(n -2)
if __name__ == '__main__':
n = int(input("请输入一个正整数:"))
time1 = datetime.datetime.now()
print(str(n)+"序列上数字为:",fib(n))
time2 = datetime.datetime.now()
print("计算菲波那契数列锁需要花费的时间。",time2-time1)
输出:
请输入一个正整数:3
3序列上数字为: 2
计算菲波那契数列锁需要花费的时间。 0:00:02.062182
明天继续更新,加油!!!
迟到的更新
理解递归思路,直接上代码
import datetime
def fib(n):
if n < 2:
print("f(" + str(n) + ")" + "=" + str(n),"递归")
return n
else:
print("f(" + str(n) + ")=" + "f(" + str(n - 1) + ")" + " + f(" + str(n - 2) + ")");
r = fib(n -1) + fib(n -2)
print("f(" + str(n) + ")" + "=" + str(r))
return r
if __name__ == '__main__':
n = int(input("请输入一个正整数:"))
time1 = datetime.datetime.now()
print(str(n)+"序列上数字为:",fib(n))
time2 = datetime.datetime.now()
print("计算菲波那契数列锁需要花费的时间。",time2-time1)
输出:
请输入一个正整数:5
f(5)=f(4) + f(3)
f(4)=f(3) + f(2)
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(1)=1 s
f(3)=2
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(4)=3
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(1)=1 s
f(3)=2
f(5)=5
5序列上数字为: 5
计算菲波那契数列锁需要花费的时间。 0:00:00.000294
从上面的步骤我们可以清晰的看到递归算法的第一步是分治,把复杂的大的问题,给拆分成一个一个小问题,直到不能再拆解,通过退出条件retrun,然后再从最小的问题开始解决,只到所有的子问题解决完毕,那么最终的大问题就迎刃而解。上面的打印信息,符合栈数据结构的定义,先进后出,通过把所有的子问题压栈之后,然后再一个个出栈,从最简单的步骤计算,最终解决大问题,非常形象。
f(5) = f(4) + f(3)
f(4)=f(3) + f(2)
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)返回值自身为1
f(0)返回值自身为0
f(2) = f(1) + f(0) = 1
f(3)= f(2) + f(1)
f(1)返回值自身为1
f(3) = 2
f(4)=f(3) + f(2)
f(2)=f(1) + f(0)
f(1)返回值自身为1
f(0)返回值自身为0
f(2) = 1
f(4) = 3
以此类推下去最终得到结果f(n)