python算法:握手问题

一,题目

小明在家中举办派对,请邀请好友来参加,
来参加宴会的每两个人之间要握手,而且是仅握手一次,
则当人数为n时总共需要握手多少次?

二,解析

1,思路:
我们假设每个人到达后按先后顺序握手:
这样从人数最少时开始分析:
开始时会场中只有小明,是参会的第一个人,
假设第二个人到达时,与小明握手1次,可得:f(2) = 1
第三个人到达时,与小明,第2握手各1次,可以得到:f(3) = 2
第四位客人到达时,与小明,第2,第3握手各1次,可以得到:f(4) = 3
以此类推:
第n个人到达时,与屋内的n-1个人都握手1次,可以得到 f(n) = n-1
我们要获取的就是这些握手次数加和

2,设计:

握手次数加和:
既可以循环累加,也可以使用递归:
有两个人时的握手次数:f(2) = 1
有3个人时的握手总次数:f(3) = f(2)+2
有4个人时的握手总次数:f(4) = f(3)+3

以此类推
有n个人时的握手总次数:f(n) = f(n-1)+n-1
由此可以得到方程式:

三,编写代码:

1,使用递归函数

# 函数,得到握手总次数
# n: 参与握手的人数
def shake(n):
    if n <= 1:
        return 0
    elif n == 2:
        return 1
    else:
        return shake(n-1)+n-1
n = 12
print(f"{n}个人共需握手{shake(n)}次")

运行结果:

12个人共需握手66次

2,使用循环

# 函数,得到握手总次数
# n: 参与握手的人数
def shake(n):
    total = 0    # 初始化总次数
    for s in range(2, n + 1):     # 人数的范围:从2到n
        num = s-1       # 当前人数的握手次数
        total += num    # 加到总次数中
    return total
n = 12
print(f"{n}个人共需握手{shake(n)}次")

运行结果:

12个人共需握手66次
QR:python算法:握手问题

发表回复