递归其实很简单
递归的思想
1. 递归主要是抓住一下几个要点 :
- 最终的结果要能够分解成若干个子问题
- 子问题的解法与最终结果的解法要完全相同
- 最后要能够找到已知的初始条件(也就是可以出函数自调用的条件,这个很关键,不然就死循环啦!!!)
2. 递归的两大要素可以大致总结如下:
- 基线条件:函数不再调用自己,也可以称为终止条件。
- 递归条件:调用自己函数的条件,当然,不同的函数要有各自不同的算法,求和和求阶乘的算法当然不能一样啦。
这里举一个使用递归的累加求和的例子来理解一下基线和递归条件
def sum(x):
"""从1到x累加求和"""
#基线条件
if x == 1:
return 1
#递归条件
else:
return x + sum(x-1)
3.递归的语法
def 函数名(传入的参数):
if 基线条件1:
return 基线条件1的初始值
if 基线条件2:
return 基线条件2的初始值
......
else:
递归条件(问题的解法,调用自己)
递归的实例
就拿斐波拉契数列举个例子吧,我们都知道斐波拉契数列的形式是1,1,2,3,5,8....,规律就是后一项是前两项的和。也就是说可以写成f(n)= f(n-1) + f(n-2)的形式,相当于满足了第一个条件。而最终的结果也就是f(n)首先是可以分解成若干个解法相同的子问题的,也就是f(n-1)和f(n-2),这就满足了第二个条件。同时,我们是已知初始条件的f(1) = 1、f(2) = 1,第三个条件也有了,所以开始大胆的使用递归吧,孩儿们!!!
上代码:
def fib(x):
if x == 1:
return 1
if x == 2:
return 1
else:
return fib(x-1) + fib(x-2)
最后,写一点自己的感想吧!递归的优势在于可以使程序看起来更利于人们理解,虽然有的时候性能不如循环更高效。如果你想说“大哥,你上面写的啥乱七八糟的东西俺看不懂,到底啥时候能用递归啊?”或者你想说“有的时候看到别人用,倒是能看懂,自己用的时候就麻爪了,不知道从何下手该怎么整呢?”我只能说几个自己的小经验吧。首先,公式这个东西,如果你看到有能表示成f(n)的公式,那十有八九是可以用递归的。然后就是,怎么用递归的问题。你可以按照条件,先对应问题看看能不能拆解成满足条件的形式,如果可以那就放心大胆的用吧。最后我想说的是,不要怕递归,虽然有的时候自己写起来很难,多写几个就好了。加油吧,大家一起努力!!!