递归思想
今天来谈谈递归编程,我想参与过编程经历的,或者学过编程的都应该了解递归,递归思想在解决一些问题上显得尤为方便,能发出意想不到的效果,但是递归编程显然难度比较大,没有非常丰富的编程经验或者对递归有过很深的理解,不能随手就写出递归的代码。所以今天就来谈谈递归怎么用?
递归的编程模式就是一个函数调用本身,同时加上一些条件判断进行限制。基本上这两个部分就可以组成一个递归代码。但是偏偏是这两个部分却很难去写出来。
事实上递归问题你会发现一个现象,那就是基本上递归方法可以解决的问题都有一种“推进关系”,我把这种关系解释为,上一层跟下一层有关系,是一种层层推进的联系,也就是问题的解决是一种层层推进的结果,而不是经过复杂的过程得到结果。
我希望,如果你对递归编程也很感兴趣的话可以多多了解一下这方面的问题,总结一下规律,将来遇到可以使用递归编程解决的问题可以联想到递归思想。
下面介绍一些问题的递归编程解决:
用循环和递归分别求 ∑100 (求1到100的和)
#循环语句完成:
def sum1(num):
sum2=0
for i in range(1,num+1):
sum2+=i
return sum2
print(sum1(100))
#递归完成
def sum_a(num1):
if num1==1:
return 1
else:
return num1+sum_a(num1-1)
print(sum_a(100))
用循环和递归分别求 10!(阶乘)
#循环完成
def product1(num):
product=1
for i in range(1,num+1):
product=product *i
return product
print(product1(10))
#递归完成
def product2(num):
if num==1:
return 1
else:
return num *product2(num-1)
print(product2(10))
看过上面两段代码应该都能发现递归编程代码竟然那么简洁,当然也更难理解,上面两个问题其实算是递归应用当中的一类典型的问题,这里就有我上面说的“推进关系”,每一层递归函数的调用与上一层有关系,当然这是一种“直接关系”,下面还有一种衍生关系,待会介绍。
递归推斐波那契数列
def fabonacci(n):
''' n为斐波那契数列 '''
if n <= 2:
''' 数列前两个数都是1 '''
v = 1
return v # 返回结果,并结束函数
v = fabonacci(n-1)+fabonacci(n-2) # 由数据的规律可知,第三个数的结果都是前两个数之和,所以进行递归叠加
return v # 返回结果,并结束函数
print(fabonacci(15)) # 610 调用函数并打印结果
有没有发现这个函数调用与上面两种有一些差别,是的,这种问题用递归思路去解决很多时候更难理解,它更像是一种”衍生“。
这里我倒想说,像上面这种类型的问题其实最后都是一种“由最初到最终”,我们需要最初的条件判定加上最终的函数调用表示问题的表现形式就可以解决问题。比如上面的问题,我们对数列第一个和第二个定义好,然后用函数调用表示数列规律,由一二生三,由二三生四,最后就可以解决这个问题。
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
def f(number):
if number== 1:
return 1
if number== 2:
return 1
else:
count = f(number-1)+f(number-2)
return count
上面这个问题是不是也是一种“由最初到最终”的思路呢?也是的,所以在进行递归编程时,我们需要去理解那种推进关系,当我们设置好初始条件,利用问题的推进规律来进行编程,表示出这种规律,就可以达到“一生二,二生三,三生万物的目的”。