Python函数

本文探讨Python函数的参数灵活性,包括如何改造函数以接受一个或多个数计算乘积,并强调默认参数应使用不可变对象。此外,还介绍了递归函数的概念,以汉诺塔问题为例,详细阐述了递归函数在解决复杂问题时的应用,揭示了汉诺塔问题的递归算法思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数的参数

题目:以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积

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的方法:

汉诺塔问题算法
python中的汉诺塔递归算法的具体运算过程

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的顺序下执行了一阶汉诺塔的移法

那么推广到三阶的时候,我们将小环和中环视为一个整体,于是又变成了执行二阶汉诺塔方法。
以此类推,四阶时前三个环视为整体,五阶前四个环视为整体……我们已经找到了解决汉诺塔方法的递归算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值