使用递归从 char 列表中打印 n 长度组合

Posted

技术标签:

【中文标题】使用递归从 char 列表中打印 n 长度组合【英文标题】:Print n-length combinations from char list using recursion 【发布时间】:2019-05-02 20:14:18 【问题描述】:

我必须使用递归来解决这个问题。

在 Python 中实现一个函数,该函数接收字符列表和整数 n 作为参数。该函数必须打印长度为 n 的所有可能组合,其中每个字符都可以显示多次。

这对我来说非常令人兴奋,所有这些都是递归的。

例如,对于这个问题,我想了一个半小时,不知道我在想什么。我不知道如何开始递归思考,我从什么开始?

我写了一些废话:

def print_sequences(char_list, n):
if len(char_list) == 1:
    print(char_list[1])
else:
    sub_str = ""
    for c in char_list:
        print_sequences(list(sub_str + c), n)

请帮我培养一些递归意识。

【问题讨论】:

【参考方案1】:

你很接近。您需要检查累积的“池”列表的长度是否等于参数n,而不是len(char_list) == 1。但是,要创建一个列表来累积组合,请在函数的签名中创建一个附加参数:

def print_sequences(char_list, n, _accum):
  if len(_accum) == n:
     print(_accum)
  else:
     for c in char_list:
        print_sequences(char_list, n, _accum+[c])


print_sequences([1, 2, 3, 4], 4, [])

输出:

[1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 1, 3]
[1, 1, 1, 4]
[1, 1, 2, 1]
[1, 1, 2, 2]
[1, 1, 2, 3]
[1, 1, 2, 4]
[1, 1, 3, 1]
[1, 1, 3, 2]
[1, 1, 3, 3]
[1, 1, 3, 4]
[1, 1, 4, 1]
[1, 1, 4, 2]
[1, 1, 4, 3]
[1, 1, 4, 4]
[1, 2, 1, 1]
....

编辑:将_accum 实现为默认列表:

def print_sequences(char_list, n, _accum=[]):
  if len(_accum) == n:
    print(_accum)
  else:
    for c in char_list:
      print_sequences(char_list, n, _accum+[c])

print_sequences([1, 2, 3, 4], 4)

【讨论】:

如果您的函数需要为 _accum 提供一个空列表,为什么不将其设置为可选并使其默认为该值? def print_sequences(char_list, n, _accum=[]): @AdamDadvar 这是一种可能性,但是,默认参数可以在后续函数调用中产生 unexpected behavior。通常,处理默认参数的最佳方法是实际将参数设置为等于None,然后稍后在函数中将该值重新分配为真正需要的默认值。但是,我认为这个过程在这个问题的背景下是矫枉过正的。 我们不能接收除 char_list 和 n 之外的任何参数。我能做什么? 该函数必须有最多 2 个参数的签名:只有 'char_list' 和 'n'。你能解释一下,我怎样才能让自己习惯于递归思考?

以上是关于使用递归从 char 列表中打印 n 长度组合的主要内容,如果未能解决你的问题,请参考以下文章

从给定的单词列表中生成具有“N”长度的所有可能组合(寻找不重复)

递归序列python

从包含不同长度子列表的列表中构造所有组合

如何(廉价)计算 n 个可能元素的所有可能的长度-r 组合

9.9递归和动态规划——打印n对括号的所有有效组合(即左右括号正确配对)

组合问题