函数的参数
题目:以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积
def product(x, *y):
if not isinstance(x, (int, float)):
raise TypeError('数据格式不合法')
else:
for num in y:
x = x*num
return x
# 测试
print('product(5) =', product(5))
print('product(5, 6) =', product(5, 6))
print('product(5, 6, 7) =', product(5, 6, 7))
print('product(5, 6, 7, 9) =', product(5, 6, 7, 9))
if product(5) != 5:
print('测试失败!')
elif product(5, 6) != 30:
print('测试失败!')
elif product(5, 6, 7) != 210:
print('测试失败!')
elif product(5, 6, 7, 9) != 1890:
print('测试失败!')
else:
try:
product()
print('测试失败!')
except TypeError:
print('测试成功!')
#运行结果
product(5) = 5
product(5, 6) = 30
product(5, 6, 7) = 210
product(5, 6, 7, 9) = 1890
测试成功!
小结:
Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
递归函数
题目:汉诺塔的移动可以用递归函数非常简单地实现。
请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法:
def move(n, a, b, c):
if n == 1:
print(a, '-->', c)
else:
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
# 期待输出:
# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C
move(3, 'A', 'B', 'C') #运行结果正确
总结:
当N=1时,即一阶时它的路径很简单只需要从A->C进行移动。
当N=2时,即二阶汉诺塔相当于执行了三大步骤:
1.在ACB的顺序下执行了一阶汉诺塔的移法
2.从A->C移动了最大盘
3.在BAC的顺序下执行了一阶汉诺塔的移法
那么推广到三阶的时候,我们将小环和中环视为一个整体,于是又变成了执行二阶汉诺塔方法。
以此类推,四阶时前三个环视为整体,五阶前四个环视为整体……我们已经找到了解决汉诺塔方法的递归算法。