使用递归创建随机元素列表

时间:2018-11-11 19:13:23

标签: python recursion random

要求我定义一个包含两个参数的递归函数:

  • 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}}个随机数的列表?

3 个答案:

答案 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)来生成0valmax之间的单个随机整数:

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 ]