共计 3790 个字符,预计需要花费 10 分钟才能阅读完成。
汉诺塔问题
-
规定:
- 每次只能挪动一个盘子
- 任意一次挪动,三个塔的状态必须是小盘子在上,大盘子在上
-
办法:
- n=1:间接把 A 上的一个盘子挪动到 C 上,A->C
-
n=2:
- 把小盘子从 A 放到 B 上,A->B
- 把大盘子从 A 放到 C 上,A->C
- 把小盘子从 B 放到 C 上,B->C
-
n=3:
- 把 A 上的两个盘子,通过 C 挪动到 B 下来,调用递归实现
- 把 A 上剩下的一个最大盘子挪动到 C 上,A->C
- 把 B 上两个盘子,借助于 A,挪到 C 下来,调用递归
-
n=n:
- 把 A 上的 n - 1 个盘子,借助于 C,挪动到 B 下来,调用递归
- 把 A 上的最大盘子,也是惟一一个,挪动到 C 下来,A->C
- 把 B 上 n - 1 个盘子,借助于 A,挪动到 C 下来,调用递归
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 | |
n = 2 | |
hano(n, a, b, c) |
A --> B | |
A --> C | |
B --> C | |
n = 3 | |
hano(n, a, b, c) |
A --> C | |
A --> B | |
C --> B | |
A --> C | |
B --> A | |
B --> C | |
A --> C | |
n = 5 | |
hano(n, a, b, c) |
A --> C | |
A --> B | |
C --> B | |
A --> C | |
B --> A | |
B --> C | |
A --> C | |
A --> B | |
C --> B | |
C --> A | |
B --> A | |
C --> B | |
A --> C | |
A --> B | |
C --> B | |
A --> C | |
B --> A | |
B --> C | |
A --> C | |
B --> A | |
C --> B | |
C --> A | |
B --> A | |
B --> C | |
A --> C | |
A --> B | |
C --> B | |
A --> C | |
B --> A | |
B --> C | |
A --> C | |
List(列表)
- del:删除命令
# del 删除 | |
a = [1,2,3,4,5,6] | |
del a[2] | |
print(a) |
[1, 2, 4, 5, 6] | |
# del 删除 | |
# 如果应用 del 之后,id 的值和删除前不一样,则阐明删除生成了一个新的 List | |
a = [1,2,3,4,5,6] | |
print(id(a)) | |
del a[2] | |
print(id(a)) | |
print(a) |
1787345100360 | |
1787345100360 | |
[1, 2, 4, 5, 6] | |
# del 一个变量后不能再持续应用此变量 | |
del a | |
print(a) |
--------------------------------------------------------------------------- | |
NameError Traceback (most recent call last) | |
<ipython-input-15-a09b634934b2> in <module> | |
1 # del 一个变量后不能再持续应用此变量 | |
----> 2 del a | |
3 print(a) | |
NameError: name 'a' is not defined | |
列表相加
# 应用加号连贯两个列表 | |
a = [1,2,3,4,5] | |
b = [5,6,7,8,9] | |
d = ['a', 'b', 'c'] | |
c = a + b + d | |
print(c) |
[1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 'a', 'b', 'c'] | |
# 应用乘号操作列表 | |
# 列表间接跟一个整数想乘 | |
# 相当于把 n 个列表接在一起 | |
a = [1,2,3,4,5] | |
b = a * 3 | |
print(b) |
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5] | |
# 成员资格运算 | |
# 就是判断一个元素是否在列表 list 里边 | |
a = [1,2,3,4,5,6] | |
b = 8 | |
# c 的值是一个布尔值 | |
c = b in a | |
print(c) | |
b = 4 | |
print(b in a) |
False | |
True | |
# not in | |
a = [1,2,3,4,5] | |
b = 9 | |
print(b not in a) |
True | |
列表的遍历
- for
- while
# for in list | |
a = [1,2,3,4,5] | |
# 挨个打印 a 里边的元素 | |
for i in a: | |
print(i) |
1 | |
2 | |
3 | |
4 | |
5 | |
# java, c++ 程序员写的 python 代码是这样的 | |
for i in range(0,len(a)): | |
print(a[i]) | |
i += 1 |
1 | |
2 | |
3 | |
4 | |
5 | |
b = ["I love you"] | |
for i in b: | |
print(i) |
I love you | |
# range | |
# in 前面的变量要求是能够迭代的内容 | |
for i in range(1,10): | |
print(i) | |
print(type(range(1,10))) |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
<class 'range'> | |
# while 循环拜访 list | |
# 个别不必 while 遍历 list | |
a = [1,2,3,4,5,6] | |
length = len(a) | |
# indx 示意的是 list 的下标 | |
indx = 0 | |
while indx < length: | |
print(a[indx]) | |
indx += 1 |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
# 双层列表循环 | |
# a 为嵌套列表,或者叫双层列表 | |
a = [["one", 1], ["two", 2], ["three", 3]] | |
for k,v in a: | |
print(k, "--", v) |
one -- 1 | |
two -- 2 | |
three -- 3 | |
# 双层列表循环变异 | |
# a 为嵌套列表,或者叫双层列表 | |
a = [["one", 1, "enis"], ["two", 2], ["three", 3,4,5,6,8]] | |
for k,v in a: | |
print(k, "--", v) |
--------------------------------------------------------------------------- | |
ValueError Traceback (most recent call last) | |
<ipython-input-44-db702adbc386> in <module> | |
4 a = [["one", 1, "enis"], ["two", 2], ["three", 3,4,5,6,8]] | |
5 | |
----> 6 for k,v in a: | |
7 print(k, "--", v) | |
ValueError: too many values to unpack (expected 2) | |
# 双层列表循环变异 | |
# a 为嵌套列表,或者叫双层列表 | |
a = [["one", 1, "enis"], ["two", 2, "zwei"], ["three", 3, "drei"]] | |
# 这个例子阐明:k,v,w 的个数应该跟解包进去的变量个数统一 | |
for k,v,w in a: | |
print(k, "--", v, "--", w) |
one -- 1 -- enis | |
two -- 2 -- zwei | |
three -- 3 -- drei | |
列表外延:List content
- 通过简略的办法创作列表
# for 创立 | |
a = ['a', 'b', 'c'] | |
# 用 List a 创立一个 List b | |
# 上面的代码的含意是,对于所有 a 中的元素,一一放入新列表 b 中 | |
b = [i for i in a] | |
print(b) |
['a', 'b', 'c'] | |
# 对 a 中所有元素乘以 10,生成一个新 List | |
a = [1, 2, 3, 4, 5] | |
# 用 List a 创立一个 List b | |
# 上面的代码的含意是,对于所有 a 中的元素,一一放入新列表 b 中 | |
b = [i*10 for i in a] | |
print(b) |
[10, 20, 30, 40, 50] | |
# 还能够过滤原来 List 中的内容并放入新列表 | |
# 比方原有列表,须要把所有 a 中的偶数生成新的列表 b | |
a = [x for x in range(1,35)] # 生成从 1 到 34 的一个列表 | |
# 把 a 中所有偶数生成一个新的列表 b | |
b = [m for m in a if m % 2 == 0] | |
print(b) |
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34] | |
# 列表生成式能够嵌套 | |
# 有两个列表 a,b | |
a = [i for i in range(1,4)] # 生成 List a | |
print(a) | |
b = [i for i in range(100,400) if i % 100 == 0] | |
print(b) | |
# 列表生成是能够嵌套,此时等于两个 for 循环嵌套 | |
c = [m+n for m in a for n in b] | |
print(c) | |
# 下面代码跟上面代码等价 | |
for m in a: | |
for n in b: | |
print(m+n, end=" ") | |
print() | |
# 嵌套的列表生成也能够用条件表达式 | |
c = [m+n for m in a for n in b if m+n < 250] | |
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] | |
对于列表的罕用函数
# len:求列表长度 | |
a = [x for x in range(1,100)] | |
print(len(a)) | |
# max:求列表中的最大值 | |
# min:同理 | |
print(max(a)) | |
b = ["man", "film", "python"] | |
print(max(b)) |
99 | |
99 | |
python | |
# List:将其余格局的数据转换成 List | |
a = [1,2,3] | |
print(list(a)) |
[1, 2, 3] | |
s = "I love you" | |
print(list(s)) |
['I', '','l','o','v','e',' ','y','o','u'] | |
# 把 range 产生的内容转换成 list | |
print(list(range(12,19))) |
[12, 13, 14, 15, 16, 17, 18] | |
正文完