仿真中的无限循环

| 我从python开始。.我在下面编写的详细信息..它进入无限循环,当我尝试在内部调用该函数时给我一个错误。.是否不允许这种递归? 在下面发布代码。.感谢您的所有帮助:) 该计划假设我们有100名乘客登机。假设第一个人失去了登机牌,他会找到一个随机的座位并坐在那里。然后,如果没有人坐下,其他来客将坐在他们的位置,如果有人坐下,则坐在其他随机座位上。 最终目的是找到最后一位乘客不会坐在自己座位上的可能性。我还没有添加循环部分 使其成为适当的模拟。上面的问题实际上是概率上的难题。我尝试验证答案,因为我没有真正遵循推理。
import random
from numpy import zeros

rand = zeros((100,3))
# The rows are : Passenger number , The seat he is occupying and if his designated     seat is occupied. I am assuming that the passengers have seats which are same as the order in which they enter. so the 1st passenger enter has a designated seat number 1, 2nd to enter has no. 2 etc.

def cio(r):  # Says if the seat is occupied ( 1 if occupied, 0 if not)
    if rand[r][2]==1:
        return 1
    if rand[r][2]==0:
        return 0

def assign(ini,mov):    # The first is passenger no. and the second is the final seat he gets. So I keep on chaning the mov variable if the seat that he randomly picked was occupied too. 
    if cio(rand[mov][2])== 0 :
        rand[mov][2] = 1
        rand[mov][1] = ini
    elif cio(rand[mov][2])== 1 :
        mov2 = random.randint(0,99)
 #       print(mov2)            Was used to debug.. didn\'t really help
        assign(ini,mov2)        # I get the error pointing to this line :(

# Defining the first passenger\'s stats.
rand[0][0] = 1
rand[0][1] = random.randint(1,100)
m = rand[0][1]
rand[m][2]= 1

for x in range(99):
    rand[x+1][0] = x + 2

for x in range(99):
    assign(x+1,x+1)

if rand[99][0]==rand[99][1] :
    print(1);
else :
    print(0);
请告诉我是否所有错误都相同。.也请告诉我是否违反任何规则,这是我要发布的第一个问题。对不起,它似乎太长了。 这应该是这样... 在以下情况下,该代码可以正常工作:
def assign(ini,mov):
if cio(mov)== 0 :     \"\"\"Changed here\"\"\"
    rand[mov][2] = 1
    rand[mov][1] = ini
elif cio(mov)== 1 :    \"\"\"And here\"\"\"
    mov2 = random.randint(0,99)
    assign(ini,mov2)  
我正在Windows 7上使用Python 2.6.6,使用的是Enthought Academic版本的Python软件。 http://www.enthought.com/products/getepd.php 同样,这个难题的答案是0.5,这实际上是我通过运行10000次得到的(几乎)。 我在这里没有看到它,但它必须在线上可用。 http://www.brightbubble.net/2010/07/10/100-passengers-and-plane-seats/     
已邀请:
        虽然允许递归,但这并不是您最好的选择。 Python强制了递归函数的上限。您的循环似乎超出了上限。 您确实想要分配中的某种
while
循环。
def assign(ini,mov):    
   \"\"\"The first is passenger no. and the second is the final seat he gets. So I keep on chaning the mov variable if the seat that he randomly picked was occupied too. 
   \"\"\"
   while cio(rand[mov][2])== 1:
      mov = random.randint(0,99)

   assert cio(rand[mov][2])== 0
   rand[mov][2] = 1
   rand[mov][1] = ini
这可能是您正在尝试做的更多事情。 注意对您的评论所做的更改。
def
之后的三引号字符串。     
        您可能可以使用动态编程找到确切的解决方案 http://en.wikipedia.org/wiki/Dynamic_programming 为此,您将需要在递归函数中添加备忘录: 什么是备忘录,如何在Python中使用备忘录? 如果您只是想使用带有随机数的仿真来估计概率,那么我建议您在概率变得很小时在一定深度后打破递归函数,因为这只会更改一些较小的小数位(最有可能。您可能希望在更改深度时绘制结果变化)。 要测量深度,可以在参数中添加一个整数: f(深度):    如果深度> 10:        还东西     否则:f(depth + 1) 默认情况下,允许的最大递归深度为1000,尽管您可以更改此值,但在得到答案之前,内存将耗尽     

要回复问题请先登录注册