简单递归——比赛配对次数问题

题目:
Alan了解到比赛的一种配对分配规则如下:
如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。 如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进入下一轮。
给你一个整数 n ,表示比赛中的队伍数。返回在比赛中进行的配对次数,直到决出获胜队伍为止。

代码:

def a(b):
    if b==2:    return 1
    if b%2==0:
        return (b/2+a(b/2))
    else:
        return ((b-1)/2+a((b+1)/2))
b = int(input())
print(int(a(b)))

主要分为三种情况:
①:基础情况即当只有两队的时候直接返回2。
②:当队伍数为偶数的时候,比赛次数:队伍数为当前队伍数一半的队伍的比赛次数+当前队伍比赛这一次的次数即(当前队伍数/2)。
③:当队伍数为奇数的时候,比赛次数:当前队伍比较这一次的次数即((当前队伍数-1)/2) + 下一次队伍的比赛次数即((当前队伍数+1)/2)。

递归其实先了解这个函数的功能。然后想象在第n次中用前一次的函数功能来描述这个函数。

注意: 描述函数功能时要运用函数中的每一个形参。
如此题:
功能: 返回队伍数为b的比较次数。
队伍数为b的比较次数为:当前比较一次的次数 加上 比较后形成的队伍数的比较次数。
当前比较一次的次数又因为当b为奇为偶情况不同。
所以分情况讨论之后,这两部分就完成了。
最后还要加上一个递推的底线即最下层:b==2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值