【问题标题】:Print n-length combinations from char list using recursion使用递归从 char 列表中打印 n 长度组合
【发布时间】: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)

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

【问题讨论】:

    标签: python python-3.x list recursion combinations


    【解决方案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'。你能解释一下,我怎样才能让自己习惯于递归思考?
    猜你喜欢
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多