0%

递归小结

关于递归
这几日作递归题,一直都没什么思路,常常需要看看答案才能懂

幸亏,答案看着看着,好像可以大概总结出一套模板

1
2
3
4
5
6
7
8
def fun(arguments):
赋初值,定义容器
if conditions条件:
返回值,递归,改变参数,‘循环体’
(返回值处理)
return 返回值
else
return 开始递归

典例:
1
2
3
4
5
6
7
8
def Bindec(x):
result = ' '
if x :
result = Bindec(x // 2)
return result + str(x % 2)
else:
return result
print("二进制数为:",Bindec(1024))

递归分为递推和回推,注意返回条件设置

总结出了模板,做题居然就不费劲了,我觉得主要是把上面的理论成功转化为了编程理论,所以思路顺畅了。

但模板还比较死,注意变通,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 拆分参数
def get(x):
result = list()
if x:
result = get(x // 10)
result.append(x % 10)
return result
else:
return result
#简单版
result = list()
def simple(x):
if x:
result.insert(0, x%10)
simple(x//10)
i = int(input("输入一个数:"))
print(get(i)) ;
simple(i) ;
print(result)

这道题标答中并不像我返回并放好列表元素,它递归直接返回元素然后放入外部的列表中。但其实很多标答都和我的模板一样,只是了简化语句,大多是简化递推那部分,比如下例简短而有代表性:

1
2
3
if n != 1:
a = age(n-1)
return a + 2 #这两句可简化为一句:return age = (n-1)+2

PS:

list.insert()方法的返回值为空类型!



2018-1-7 17:49

最近做的文件处理题目,用到递归且比较独特,于是前来补充:

独特之处在于这种递归没有返回值

如下是搜索返回文件的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
import os
def found(file, folder):
os.chdir(folder)
l1 = os.listdir(os.getcwd())
for each in l1:
if os.path.isdir(each):
found(file, each) #继续执行函数但注意细节,如这里当前文件目录已经在递归过程中改变,需回位!!
os.chdir('..')
elif each == file:
print(os.getcwd() + os.sep + file) #到递归底层打印结果,无返回值,直接开始回推
folder = input('请输入待查找的初始目录:')
file = input('请输入目标文件:')
found(file, folder)

2018-04-28
多年以后的现在,跟杜市容了解了一下一些算法的东西


完结 撒花 ฅ>ω<*ฅ