#10的阶乘(递归应用)
def fact(n):
print("factorial has been called with n=" + str(n))
if n==1:
return 1
else:
res = n * fact(n - 1)
print("intermediate result for",n,"*fact(",n-1,"):",res)
return res
print(fact(10))
分治算法:其实上次写的快速排序算法就是用到了分而治之的思想,也属于递归思想的应用。所谓分而治之就是对问题不断进行分割,直到找到最小单元的问题的解法,让后再扩散到整个问题的求解过程,达到各个击破的效果。
举个例子,要将一个168×64的矩形均匀地分成方块,且分出的方块要尽可能大。这个要怎么实现呢?
一般是从最小的边开始探索,
然后开始思考被割剩下的64×40的,从最小边40开始探索:
一直分割下去,直到找到一个8×8的方块,就是最小的解决问题的单元。
算法练习:
求顺序表中最大值:
#基本子算法(子问题规模小于或等于2时)
def get_max(max_list):
return max(max_list)
#分治法
def solve2(init_list):
n = len(init_list)
if n<=2: #若问题规模小于或等于2,解决
return get_max(init_list)
#分解(子问题规模为n/2)
left_list,right_list=init_list[:n//2],init_list[n//2:]
#递归(树),分治
left_max,right_max=solve2(left_list),solve2(right_list)
#合并
return get_max([left_max,right_max])
if __name__=="__main__":
test_list=[12,2,23,45,67,3,2,4,45,63,24,23]
print(solve2(test_list))