Python:如何递归模拟范围内的随机行走(无循环)

2024-03-29 09:24:40 发布

您现在位置:Python中文网/ 问答频道 /正文

一个朋友跟我打赌我不能递归地写这个。不幸的是他赢了,但我仍在想我该怎么做:

该函数是:rw_in_range(启动、低、高)

输入包括:

开始—表示“梦游者”开始位置的正整数

—一个正整数,表示“梦游者”可以漫游到最左边的位置

-一个正整数,代表“梦游者”可以漫游到的最右边的位置

低<;=开始<;=高

该函数应该模拟一个随机行走,“梦游者”在由低和高边界给定的位置范围内徘徊。在

梦游者随机走几步,其大小通过调用我的函数得到:

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')语句,它应该如下所示:

^{pr2}$

我的函数当前如下所示:

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)

我的问题是,如何修复我的代码,让它递归地运行这个序列?因为它永远不会返回值。在


Tags: or函数inltnewdefsteprange
1条回答
网友
1楼 · 发布于 2024-03-29 09:24:40

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

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

相关问题 更多 >