递归算法实例
先copy一下百度百科的解说。程序调用自身的编程技巧称为递归(recursion)。
例如,要计算1-9的9位数字的乘积,直观的算法是1*2*3*4*5*6*7*8*9,如果要
计算1-10000的乘积,直观的算法就难于实现出,而递归就可以很简单的实现。
实例1
1 # coding: utf-8 2 3 # recursion:递归 4 # 若函数无return, 则用print type(recurision(10)), 显示其是NoneType, 5 # 而显然只有数值才能和数值相乘。所以我们用return返回函数的值(int型)。 6 7 def recursion(n): 8 if n == 1: 9 return n 10 else: 11 return n + recursion(n - 1) 12 13 print recursion(1) 14 print recursion(10)
好吧, 是不是没看懂啊。一开始我也摸不着头脑。 不过既然是数学问题,列个式子
你就知道了。
recurision(n) = n * resurision(n - 1)
= n * (n - 1) * recurison(n - 2)
直到 n = 1, 也就是if成立的时候, 再返回n,so easy!
注意: 这里之所以加粗强调返回n, 是因为最后当 n = 1时, 也就是100 * 99 * ...2 * recurison(1)
时,如果此时还不返回n, 那岂不是变成了一个整数和函数直接相乘? 而不是和函数的返回值, 这当然
是不允许的!
如果写成下面这种,大家可能就看得懂了。
1 # coding: utf-8 2 3 def add(n): 4 total = 0 5 6 for i in range(1, n + 1): 7 total += i 8 return total 9 10 print add(1) 11 print add(10)
输出:
----------------------------------------------------------------------------------
实例2
我们要删除脚本文件('.py'程序)所在的文件夹下面的所有文本文件(以'.txt' 为后缀名)
1 # coding: utf-8 2 3 import os 4 import sys 5 6 # 脚本文件所在的目录/路径,比如'c:\python27\1.py'前面的'c:\python27' 7 currdir = sys.path[0] 8 9 # os.path.isdir判断是否为文件夹, 是为True, 反之为False. 同理isfile判断是否为文件 10 def RemoveFile(dir, postfix): 11 if os.path.isdir(dir): 12 for file in os.listdir(dir): # os.listdir列出dir目录下所有的子文件和子文件夹。 13 RemoveFile(dir + '\\' + file, postfix) 14 15 elif os.path.splitext(dir)[1] == postfix: # os.path.splitext()将文件名的前缀与后缀分开, 比如1.txt的1和.txt 16 17 os.remove(dir) # os.remove()删除该文件 18 19 20 21 RemoveFile(currdir, '.txt') 22 23
Ok, 让我们来消化一下。假设我们的这个脚本名是1.py, 放在'c:\python27'下, 而这文件夹里面还有
1.txt和2.txt之类要删除的文件。
执行RemoveFile(currdir, '.txt')之后肯定是if语句先成立,因为currdir首先就是py文件所在的目录了(目
录除了路径的意思,就是指文件夹) 。而像RemoveFile('c:\\python27' + '\\' + 1.py, '.txt')一看就后缀名不
一样。踢掉。 所以, 最后,只有txt文件是符合elif的情况的。顺利删除。