递归算法实例

    先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的情况的。顺利删除。

 

posted @ 2016-07-23 23:57  坏小孩D_R  阅读(220)  评论(0编辑  收藏  举报