题目:
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