使用递归从 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”长度的所有可能组合(寻找不重复)