要求我定义一个包含两个参数的递归函数:
n
valmax
和返回从间隔n
[0 , valmax]
个数字的列表
`
import random
def random_list(n, valmax, lst = []):
"""
parameters : n of type int;
valmax of type int;
returns : a list of n numbers picked randomly from the interval
[0, valmax]
"""
if len(lst) == n:
return lst
return [random.randint(0, valmax)] + random_list(n, valmax)
print(random_list(10,100))`
但是,我得到
RecursionError
如何修复我的代码,使其返回间隔为n
的{{1}}个随机数的列表?
答案 0 :(得分:3)
您的逻辑是错误的。您需要每个函数调用来返回n
个随机整数,因此不需要在列表中传递它。
每个函数都会生成一个[0, valmax]
范围内的单个随机数,并将其连接到一个随机整数列表,该整数列表的长度要比其递归调用自身的长度少(n-1
)。
基本情况是当n == 1
时,在这种情况下,我们返回一个空列表。
import random
def random_list(n, valmax):
if n == 0:
return []
return [random.randint(0, valmax)] + random_list(n-1, valmax)
和测试:
random_list(10, 20)
#[20, 9, 4, 7, 3, 4, 3, 18, 19, 9]
答案 1 :(得分:2)
与其保留默认参数(也可能导致unexpected behavior on consecutive calls),不如使用yield
作为更干净的解决方案。另外,只需使用random.randint(0, valmax)
来生成0
和valmax
之间的单个随机整数:
import random
def random_list(n, valmax):
if n:
yield random.randint(0, valmax)
yield from random_list(n-1, valmax)
print(list(random_list(10, 10))) #create a list of length ten with random values between 0 and 10, inclusive.
输出:
[4, 6, 9, 1, 10, 2, 2, 8, 2, 10]
答案 2 :(得分:1)
您可以编写一个通用的build_list
函数-
import random
def identity (x):
return x
def build_list (size, proc = identity):
if size == 0:
return []
else:
return build_list (size - 1, proc) + [ proc (size - 1) ]
print (build_list (5))
# [ 0, 1, 2, 3, 4 ]
print (build_list (5, lambda _: random.randint (0, 10)))
# [ 4, 7, 7, 3, 6 ]
random_list
可以是build_list
的专业化-
def random_list (size, valmax):
return build_list (size, lambda _: random.randint (0, valmax))
print (random_list (5, 10))
# [ 1, 7, 4, 7, 0 ]