一位朋友打赌我不能递归地写这个。不幸的是他赢了,但我仍然想知道如何做到这一点:
功能是: rw_in_range(开始,低,高)
输入是:
开始 - 一个表示“梦游者”起始位置的正整数
低 - 代表最左边位置的正int,“梦游者”将被允许徘徊到
高 - 一个代表最右边位置的正int,“梦游者”将被允许徘徊到
低< = start< = 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)
我的问题是,如何修复我的代码以使其以递归方式运行此序列?因为它永远不会返回值。
答案 0 :(得分:4)
您的功能永远不会返回,因为您在返回时再次呼叫它。试试这个:
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