【问题标题】:Variable number of arguments and recursion in Python [duplicate]Python中可变数量的参数和递归[重复]
【发布时间】:2023-03-20 12:50:02
【问题描述】:

我想编写一个递归函数,它接受一个可变数量的参数(每个参数是一个可迭代的列表或集合)并返回每个参数的所有连接组合的集合。我学会了如何write functions with a variable number of arguments 并且我知道如何编写递归函数,但我不知道如何在 Python 中将这两者放在一起(或者甚至可能)。

这是我的代码:

def generate_combinations( *args ):
    # returns all combinations of each of the arguments
    if len( args ) == 1:
        return set( args[0] )

    result = set()
    lastdigits = generate_combinations( args[1:] )
    for d in args[0]:
         result.add( d + lastdigits )      

if __name__ == '__main__':
    lastDigit = [ '1', '2', '3' ]
    allDigits = [ '4', '5' ]
    print("{}".format( generate_combinations( allDigits, lastDigit )))

预期输出:

14
15
24
25
34
35

我的代码的“问题”位于第 7 行:lastdigits = generate_combinations( args[1:] )。我想在这里做的是将所有原始参数除了第一个传递给函数(从而创建递归)。这显然不是这样做的方法。我的问题:这可以做到吗?如何做到?

Ps:我知道我可以使用带有一个参数的列表来完成相同的操作,但我很好奇这是否可能。

【问题讨论】:

标签: python recursion optional-arguments


【解决方案1】:

请求的工作由这些行完成:

args = list(args)
args.pop(0)
recursiveCall( *tuple(args) )

这里你的函数实现有点错误(或者我误解了你对 set 的使用)。

def generate_combinations( *args, **kwargs ):
    print("called with", args)
    #terminate recursion
    if len(args) == 1:
        return list(set(args[0]))

    #recursion
    else:
        result = []
        args = list(args)
        heads = args.pop(0)
        tails = generate_combinations( *args, **kwargs )
        for head in heads:
            for tail in tails:
                result.append(head + tail)
        return result

if __name__ == '__main__':
    allDigits = [ '1', '2', '3' ]
    lastDigit = [ '4', '5' ]
    letters   = [ 'a', 'b' ]
    print("{}".format( generate_combinations( allDigits, lastDigit, letters , Useless='parameter')))

执行给:

['14a', '14b', '15a', '15b', '24a', '24b', '25a', '25b', '34a', '34b', '35a', '35b']

希望你喜欢这个;)

亚瑟。

【讨论】:

  • 学到了很多!非常感谢!您能解释一下为什么需要tuple 吗?我理解*,但是为什么要在递归调用函数的行中添加tuple
  • 没有必要——你也可以用*解压列表
  • 供以后参考,我认为是因为变量参数函数的完整定义是def f( *args, **kwargs )。我假设元组是指 args 和 kwargs 元组(如果我错了,请纠正我)。
  • no jonrsharpe 很好,不需要元组。出于完整性原因,我编辑了我的代码。添加了不用于向您展示如何处理 **keywordargs 的 **kwargs。
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-05
  • 1970-01-01
相关资源
最近更新 更多