【问题标题】:Python: RecursionPython:递归
【发布时间】:2010-11-26 11:06:11
【问题描述】:

虽然网络上有很多关于递归的信息,但我还没有找到任何可以应用于我的问题的信息。我对编程还是很陌生,所以如果我的问题相当琐碎,请原谅。

感谢您的帮助:)

这就是我想要的结果:

listVariations(listOfItems, numberOfDigits) 

>>> listVariations(['a', 'b', 'c'], 1)
>>> ['a', 'b', 'c'] 

>>> listVariations(['a', 'b', 'c'], 2)
>>> ['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc']

>>> listVariations(['a', 'b', 'c'], 3)
>>> ['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc', 'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc', 'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']

但到目前为止,我只能想出一个需要提前指定/知道位数的函数。这是丑陋和错误的:

list = ['a', 'b', 'c']

def listVariations1(list):
  variations = []
  for i in list:
    variations.append(i)
  return variations

def listVariations2(list):
  variations = []
  for i in list:
    for j in list:
      variations.append(i+j)
  return variations

def listVariations3(list):
  variations = []
  for i in list:
    for j in list:
      for k in list:
        variations.append(i+j+k)
  return variations

oneDigitList = listVariations1(list)
twoDigitList = listVariations2(list)
threeDigitList = listVariations3(list)

这可能很简单,但是当函数调用自身时,我想不出一个连接字符串的好方法。

感谢您的努力:)

【问题讨论】:

  • 你真的不应该使用list 作为变量名。它是内置 list 类的构造函数,当你这样做时,你会隐藏它。
  • 点了 - 不会再发生...

标签: python recursion concatenation


【解决方案1】:

您可以在itertools中使用product()函数

【讨论】:

  • list(''.join(item) for item in itertools.product(list_, repeat=3))
  • 这正是我想要实现的目标。谢谢大家:)
【解决方案2】:
from itertools import combinations_with_replacement

此功能完全符合您的要求。

【讨论】:

  • 这只适用于 python 3.1 或更高版本。反正也不对。 Srinivas Reddy Thatiparth 给出了正确的答案。
【解决方案3】:

您可以使用itertools.permutations 来执行此操作。

from itertools import permutations

def listVariations(listOfItems, numberOfDigits):
    return [''.join(x) for x in permutations(listOfItems, numberOfDigits)]

如果你确实想用递归函数调用来实现类似的东西,你可以这样做:

def permute(seq, n):
    for i in xrange(len(seq)):
        head, tail = seq[i:i+1], seq[0:i]+seq[i+1:]
        if n == 1: 
            yield head
        else:
            if tail:
                for sub_seq in permute(tail, n-1):
                    yield head + sub_seq
            else:
                yield head

a_list = ['a', 'b', 'c']
list(permute(''.join(a_list), 2))
a_str = 'abc'
list(permute(a_str, 2))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-12
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2019-01-17
    • 2017-02-20
    相关资源
    最近更新 更多