【问题标题】:Python: How To Recursively Simulate a Random Walk Within a Range (No Loops)Python:如何递归模拟范围内的随机游走(无循环)
【发布时间】:2014-09-28 20:02:08
【问题描述】:

一个朋友打赌我不能递归地写这个。不幸的是,他赢了,但我仍然想知道我将如何做到这一点:

函数为:rw_in_range(start, low, high)

输入是:

start - 一个正整数,表示“梦游者”的起始位置

low - 一个正整数,表示允许“梦游者”游荡到的最左侧位置

high - 一个正整数,表示允许“梦游者”游荡到的最右侧位置

该函数应模拟随机游走,其中“梦游者”在低和高边界给定的位置范围内游荡。

梦游者随机走几步,其大小由调用我的函数给出:

def random_step():
    """ chooses a random step (-1 or 1) and returns it.
        inputs: none! However, make sure to use parens when calling it.
                For example: random_step()
    """
    return random.choice([-1, 1])

随机游走应该继续,直到给定的步骤导致“梦游者”到达/超出边界低或高之一。然后该函数应返回梦游者到达停止位置所走的步数。

例如,在第一行使用语句 print((' ' * start) + 'S'),它应该如下所示:

>>> rw_in_range(10, 5, 15)
      S
     S
    S
   S
    S
     S
    S
   S
  S
 S

9

我的功能目前是这样的:

def rw_in_range(start, low, high):
    print(('' * start) + 'S')
    new_start=start + random_step()
    steps_in_rest= rw_in_range(new_start, low, high)
    if new_start==low or new_start==high: 
        return rw_in_range(new_start, low, high)

我的问题是,如何修复我的代码以使其递归地运行此序列?因为它永远不会返回值。

【问题讨论】:

    标签: python recursion range random-walk


    【解决方案1】:

    您的函数永远不会返回,因为您在返回时再次调用它。试试这个:

    def rw_in_range(start, low, high):
        print(('' * start) + 'S')
        new_start=start + random_step()
        if new_start<low or new_start>high: 
            return False
        rw_in_range(new_start, low, high)
    

    如果要计算步数,最好的方法是使用列表,如下代码所示:

    import random
    
    def random_step():
      return random.choice([-1, 1])
    
    def rw_in_range(start, low, high, numberOfSteps):
      if start < low or start > high:
          return False
      print(' '*(low-1)+'|'+' '*(start-low) + 'S'+' '*(high-start)+'|')
      rw_in_range(start + random_step(), low, high, numberOfSteps)
      numberOfSteps[0] += 1
      return True
    
    numberOfSteps = [0]
    rw_in_range(10, 5, 15, numberOfSteps)
    print numberOfSteps[0]
    
    
    
    Output:
    rw_in_range(10, 5, 15, numberOfSteps)
        |     S    |
        |    S     |
        |   S      |
        |    S     |
        |   S      |
        |  S       |
        |   S      |
        |  S       |
        |   S      |
        |  S       |
        |   S      |
        |  S       |
        |   S      |
        |  S       |
        |   S      |
        |  S       |
        |   S      |
        |  S       |
        | S        |
        |S         |
        | S        |
        |S         |
    
    >>>print numberOfSteps[0]
    
    22
    

    如果要保留函数的界面,请使用以下代码:

    def rw_in_range(start, low, high):
        print((' ' * start) + 'S')
        new_start=start + random_step()
        if new_start<low or new_start>high: 
            return 0
        numberOfSteps = rw_in_range(new_start, low, high)
        return numberOfSteps + 1
    

    【讨论】:

    • 非常感谢 Varez 先生。这非常有效,但是否有可能只使用 rw_in_range 中的 3 个输入来获得相同的结果?只是想知道
    • 是的,有可能,我最后回答了你上面的问题。
    • 抱歉,我没看到。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2014-02-19
    相关资源
    最近更新 更多