📜  | |问题 18(1)

📅  最后修改于: 2023-12-03 15:06:08.772000             🧑  作者: Mango

介绍 "| | 问题 18"

"| | 问题 18"是一个计算机领域的经典问题,也被称为"小球下落问题"。这个问题涉及到离散数学中递推算法和概率论中期望的计算。

问题描述

现有一系列的空竹桶,桶内从上至下编号为1, 2, 3, ……。在第n个桶的底部放置一个小球,任意时间小球有等概率向左或向右滚动一格,当小球滚到1号桶的底部时只能向右滚动,当小球滚到最后一个桶底端时只能向左滚。若小球在第1个桶底端向右滚动,则小球离开空竹桶。求小球离开空竹桶的期望次数。

解法

这个问题可以使用递推算法来解决。首先,将第1个桶归为两个不同的情况:首先,小球可以在第1个桶向右滚动离开空竹桶;其次,小球可以在第1个桶向左滚动掉头进入第2个桶。因此,问题可以分解为两个子问题:1)小球在第1个桶向右滚动的情况下,离开空竹桶的期望次数;2)小球在第1个桶向左滚动掉头进入第2个桶的情况下,离开空竹桶的期望次数。

设 F(n) 为小球从第n个桶开始滚动,离开空竹桶的期望次数,则上述两个子问题的解可以表示为:

F(1) = 1 + 1/2 * F(2) + 1/2 * F(1) F(n) = 1 + 1/2 * F(n-1) + 1/2 * F(n+1)

其中,第一个式子表示小球在第1个桶向右滚动的情况。因为小球在第1个桶向右滚动只有一次机会,所以需要额外加上一次滚动的期望1。同时,小球在第1个桶向左滚动时,会进入第2个桶,所以需要计算小球从第2个桶开始向下滚动的期望次数F(2)。

第二个式子表示小球在其余桶内滚动的情况。小球有一半的概率向左滚动进入下一个桶,另外一半的概率向右滚动进入上一个桶。因此,小球从第n个桶开始向下滚动的期望次数就等于1加上其向左滚动的期望次数F(n-1)和向右滚动的期望次数F(n+1)的一半之和。

最终,需要解决这个递推式,得到离开空竹桶的期望次数。具体解法和细节可以查看代码实现。

代码实现
def expected_num_of_times(n: int) -> float:
    F = [0] * (n + 2)  # 多加两个哨兵,方便计算
    F[1] = 2.0  # 第一个桶向右滚动
    for i in range(2, n+2):
        F[i] = 1 + 0.5 * F[i-1] + 0.5 * F[i+1]
    return F[1]

print(expected_num_of_times(18))  # 输出离开空竹桶的期望次数

以上是本问题的解决方案,可以更好地理解递推算法和期望的计算。