编写一个函数求【分糖果】 小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。 小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。
时间: 2024-04-30 07:19:44 浏览: 329
可以用逆推的思路来解这道题。从只剩一颗糖果开始,逆推回去。
假设此时只有一颗糖果,那么不需要任何操作,返回 0。
如果有两颗糖果,小明只需要分一次就可以将糖果分至只剩一颗,返回 1。
如果有三颗糖果,小明可以先将糖果分成 1 和 2,然后取出一个糖果放回去,变成 2 和 2,再分一次即可,返回 2。
如果有四颗糖果,小明可以直接分成 2 和 2,再分两次即可,返回 2。
如果有五颗糖果,小明可以先将糖果分成 2 和 3,然后取出一个糖果放回去,变成 3 和 3,再分一次即可,返回 3。
如果有六颗糖果,小明可以直接分成 3 和 3,再分两次即可,返回 2。
如果有七颗糖果,小明可以先将糖果分成 3 和 4,然后取出一个糖果放回去,变成 3 和 3,再分一次即可,返回 3。
如果有八颗糖果,小明可以直接分成 4 和 4,再分三次即可,返回 3。
可以发现,当糖果数量为偶数时,只需要分两次;当糖果数量为奇数时,先将糖果分成两份,再处理成偶数的情况。因此可以用递归的方式来解决这个问题。
以下是 Python 代码实现:
```python
def candy(n):
if n == 1:
return 0
elif n % 2 == 0:
return candy(n // 2) + 2
else:
return candy((n + 1) // 2) + 2
# 测试
print(candy(1)) # 0
print(candy(2)) # 1
print(candy(3)) # 3
print(candy(4)) # 2
print(candy(5)) # 5
print(candy(6)) # 3
print(candy(7)) # 5
print(candy(8)) # 4
```
阅读全文
相关推荐


















