模拟中的无限循环

时间:2011-05-27 14:23:16

标签: python recursion infinite-loop

我开始使用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);

如果你们都得到同样的错误,请告诉我。如果我违反任何规则,请告诉我,因为我发布了第一个问题。抱歉,如果它看起来太长了。

这应该是怎样的...... 在这种情况下,代码可以正常使用以下mod:

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 Version of Python的软件。 http://www.enthought.com/products/getepd.php

这个难题的答案也是0.5,这实际上是我(通常)运行10000次所得到的。

我没有在这里看到它,但它必须在线提供.. http://www.brightbubble.net/2010/07/10/100-passengers-and-plane-seats/

2 个答案:

答案 0 :(得分:0)

递归,虽然允许,但不是你最好的首选。

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之后的三引号字符串。

答案 1 :(得分:0)

您可以使用动态编程找到确切的解决方案 http://en.wikipedia.org/wiki/Dynamic_programming 为此,您需要为递归函数添加memoization: What is memoization and how can I use it in Python?

如果你只是想用随机数模拟估计概率,那么我建议你在一定深度之后突破你的递归函数,当概率变得非常小时,因为这只会改变一些较小的小数位(大多数)可能..你可能想在改变深度时绘制结果的变化。)

测量您可以为参数添加整数的深度: F(深度):    如果深度> 10:        回报一些东西     否则:f(深度+ 1)

默认情况下允许的最大递归深度为1000,尽管您可以更改此内容,但在得到答案之前内存不足