汉诺塔问题
- 规则:
1. 每次移动一个盘子 2. 任何时候大盘子在下面,小盘子在上面
- 方法:
1. n=1: 直接把A上的一个盒子移动到C上面,A->c 2. n=2: 1.把小盘子从A放到B上,A->B 2.把大盘子从A放到C上,A->C 3.把小盘子从B放到C上,B->c 3. n=3: 1. 把A上的两个盘子,通过C移动到B上去,调用递归实现 2. 把A上剩下的一个最大的盘子移动到C上,A->C 3. 把B上两个大盘子,借助于A,移到C上去,调用递归 4. n=n: 1. 把A上的n-1个盘子,通过C移动到B上去,调用递归实现 2. 把A上剩下的一个最大的盘子移动到C上,A->C 3. 把B上n-1个大盘子,借助于A,移到C上去,调用递归
In [30]:
def hano(n,a,b,c):
'''
汉诺塔的递归实现
n: 代表几个盘子
a: 代表第一个塔,开始的塔
b: 代表第二个塔,中间过度的塔
c: 代表第三个塔,目标塔
'''
if n == 1:
print (a,'-->',c)
return None
'''
if n == 2:
print (a,'-->',b)
print (a,'-->',c)
print (b,'-->',c)
return None
可以不需要
'''
#把n-1个盘子,从a塔借助c塔,移动到b塔上去
hano(n-1,a,c,b)
print (a,'-->',c)
#把n-1个盘子,从b塔,借助a塔,移动到c塔上去
hano(n-1,b,a,c)
a = 'A'
b = 'B'
c = 'C'
n=1
hano(n,a,b,c)
A --> C
In [32]:
n=3
hano(n,a,b,c)
A --> C A --> B C --> B A --> C B --> A B --> C A --> C
列表(list)
- 删除操作del
- 列表相加
- 使用加号连接两个列表
- 乘号
- 成员存在函数
- in / not in
- 列表遍历
- for/while
- 列表内涵: list content
- 通过简单的方法创作列表
In [35]:
#del删除操作
a = [1,4,2,4,2,5]
print(id(a))
del a[2]
print (id(a)) #两id一至,所以是在原列表删除
print(a)
140017770002952 140017770002952 [1, 4, 4, 2, 5]
In [37]:
#del 删除一个变量后,变量不能继续使用
del a
print(a)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-37-fc8924c35de0> in <module>() 1 #del 删除一个变量后,变量不能继续使用 ----> 2 del a 3 print(a) NameError: name 'a' is not defined
In [40]:
#连接列表
a = [1,2,3,4,5]
b = [6,5,3,2,1]
d = ['a','b','c']
c = a+b+d#加号连接
print (c)
c = a * 3 #乘号
print (c)
[1, 2, 3, 4, 5, 6, 5, 3, 2, 1, 'a', 'b', 'c'] [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
In [42]:
#成员资格运算(in / not in )
#判断一个元素是否在list里面
a = [1,2,3,4,5,6]
b = 3
c = b in a
print(c)
d = 7
print(d in a)
True False
In [44]:
#not in
a = [3,4,5,6,2,1]
b = 5
print(b not in a)
False
In [50]:
# for in list
#in 后面的变量要求为可迭代的内容
a = [1,2,3,4,5]
for i in a:
print (i)
1 2 3 4 5
In [49]:
b = ['hello']
for i in b:
print(i)
hello
In [54]:
##while
##一般不使用
a = [1,2,3,4,5]
length = len(a)
#index表示list的下标
index = 0
while index<length:
print(a[index])
index += 1
1 2 3 4 5
In [57]:
#双层列表循环
a = [[1,'a'],[2,'b'],[3,'c']]
for k,v in a:
print (k,'--',v)
1 -- a 2 -- b 3 -- c
In [60]:
#双层列表循环变形
a = [[1,'a','z'],[2,'b','x'],[3,'c','v']]
for k,v,w in a: #k,v,w 数目应该与解包出来的个数一致
print (k,'--',v,'--',w)
1 -- a -- z 2 -- b -- x 3 -- c -- v
In [66]:
# for 创建
a = ['a','b',2]
#用list a 创建list b
b = [i for i in a]
print (b)
['a', 'b', 2]
In [68]:
#乘10创建新列表
a = [1,2,3,2]
#用list a 创建list b
b = [i*10 for i in a]
print (b)
[10, 20, 30, 20]
In [71]:
#还可以进行过滤创建新的列表
#把a中的偶数生成b
a = [x for x in range(1,21)]
print (a)
b = [i for i in a if i % 2 == 0]
print(b)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
In [89]:
#列表生成也可以嵌套
a = [i for i in range(1,4)]
b = [n for n in range(100,400) if n%100 == 0]
c = [m+p for m in a for p in b] #两个for循环嵌套
print (a)
print (b)
print (c)
#for循环嵌套
for i in a:
for m in b:
print(i + m,end=' ')
print()
#也可添加if
c = [m+p for m in a for p in b if m+p < 205]
print (c)
[1, 2, 3] [100, 200, 300] [101, 201, 301, 102, 202, 302, 103, 203, 303] 101 201 301 102 202 302 103 203 303 [101, 201, 102, 202, 103, 203]
关于列表的常用函数
In [93]:
# len:求列表长度
a = [1,2,3,4,5]
print(len(a))
#max:求最大
#min:求最小
print(max(a))
print(min(a))
b = ['hello','name','goods']
print(max(b))
print(min(b))
5 5 1 name goods
In [99]:
#list:将其他格式转化为list (要求:别转化内容必须为可迭代的)
a = [1,2,3,4]
print(list(a))
b = 'hello word' #注意空格也是字符
print(list(b))
print(list(range(1,10)))
[1, 2, 3, 4] ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'd'] [1, 2, 3, 4, 5, 6, 7, 8, 9]