目录
1,什么是递归
1.1,递归与循环的区别
2,递归函数实例
2.1,Fibonacci sequence(斐波那契数列)
2.2,Collatz sequence
递归最初给我的感觉就是循环嵌套调用(并不准确),对于递归这种思想,可以从递归函数来理解。先来看看递归函数的定义:
编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。
在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。
注意上文红字【调用函数本身】,递归思想也有循环,但与循环有所区别,两种的区别我个人理解如下:
【递归】:需要求一个递归函数的值,就要调用这个递归函数,调用递归函数后又要调用递归函数......直到最后的递归函数得到一个确定的值。这时候就需要逆序,可以得到倒数第二个递归函数的值,然后得到倒数第三个递归函数的值......最后就能得到你最初始想要求的递归函数的值。
【循环】:循环得到一个值时(比如1+2+...+10),这样需要慢慢两个数相加,但加到最后时就可以直接得到结果了(死循环例外),就结束了循环。
【迭代】:重复反馈过程的活动,其目的通常是为了接近或达到所学的目标或结果
下面通过两个递归实例来更好的理解递归的思想。
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……
在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1) + F(n-2)(n>=3,n∈N*)
【递归实现】
def fib(x):
if x <2:
return 0 if x==0 else 1
else:
return fib(x - 1) + fib(x - 2)
print(fib(6))
上面的函数表明了一个数列:a0=0, a1=1, a2=1, a3= 2, a4=3, a5=5, a6=8......
【迭代实现】
def fib(x):
n1 = 1
n2 = 1
n3 = 1
while x-2 > 0:
n3 = n2 + n1
n1 = n2
n2 = n3
x -= 1
return n3
num = int(input('请输入一个正整数:'))
print(fib(num))
迭代像在通过数列的递推公式一步步计算,在数据很小的情况没什么影响,若是第50位,迭代很快给出结果,递归方式计算时间更长。通常来说,大量数据情况下,递推方式更费时,占用内存。要合理使用迭代与递归。
编写一个名为collatz()的函数,它有一个名为number 的参数。如果参数是偶数,那么collatz()就打印出number// 2,并返回该值。如果number 是奇数,collatz()就打印并返回3 * number + 1。然后编写一个程序,让用户输入一个正整数,并不断对这个数调用collatz(),直到函数返回值1
def collatz(num):
if num == 1:
return 0
elif num%2 == 0:
print(num//2)
return collatz(num//2)
elif num%2 == 1:
print(3*num+1)
return collatz(3*num+1)
print('Enter number')
a=int(input())
print('The Collatz ')
collatz(a)
执行结果如下: