【问题标题】:Recursion inside for loop (Python)for循环内的递归(Python)
【发布时间】:2022-02-03 03:35:31
【问题描述】:

我没有编写递归程序的经验。我正在尝试找到一个递归解决方案,该解决方案使用 for 循环为给定的两个字符串提供所有不同的组合。 我想找到一个在递归中使用 for 循环的解决方案。对于给定的字符串 ABC,DEF。输出必须是 AD、AE、AF、BD、BE、BF、CD、CE、CF。假设组合长度 = 2。 我写了下面的代码,它不起作用。任何人都可以帮忙吗?在 for 循环中进行递归的思考过程是什么?

def mkcb(s1, s2, i, ns):

    if i <= 2:
        print(ns)
    
    for k in range(len(s1)):
        mkcb(s1[1:], s2, i+1, s1[k] + s2[k])
        
mkcb('ABC', 'DEF', 0, '')

【问题讨论】:

标签: python recursion


【解决方案1】:

这里确实不需要递归,使用简单的嵌套 for 循环(伪代码)要容易得多:

for each char1 in "ABC":
  for each char2 in "DEF":
    print_on_screen(concatenation(char1, char2))
  next char2
next char1

【讨论】:

  • 你的伪代码比实际的 Python 代码有 more 的语法来做同样的事情。去掉 each 和最后两行,将输出行更改为 print(char1 + char2),你就会拥有真正的 Python。
【解决方案2】:

递归对于两个字符串的简单情况并没有真正意义。一对嵌套循环会容易得多。

如果您试图解决一个更普遍的问题,即组合任意数量的字符串,那么使用递归会更有意义。那么递归结合迭代的一般结构就有意义了。

我会这样做,对第一个字符串进行循环,然后对剩余的字符串进行递归。 prefix 仅关键字参数(默认为空字符串)将被传递以告诉代码已经添加了哪些字符,并且当没有剩余的字符串可供选择字符时,将打印整个前缀:

def combinations(*strings, prefix=""):
    if not strings:                         # base case, no strings left to pick from
        print(prefix)
        return

    for char in strings[0]:                 # iterate over the first string
        combinations(*strings[1:], prefix=prefix+char) # recurse on the other strings

这适用于您当前的情况 combinations("ABC", "DEF"),但也适用于更多字符串:

>>> combinations("AB", "CD", "EF", "GH")
ACEG
ACEH
ACFG
ACFH
ADEG
ADEH
ADFG
ADFH
BCEG
BCEH
BCFG
BCFH
BDEG
BDEH
BDFG
BDFH

如果您不想直接在函数中打印字符串,而是将它们返回给调用者,我会编写一个递归生成器,它不需要 prefix 的东西:

def combinations_gen(*strings):
    if not strings:
        yield ""
        return

    for char in strings[0]:
        for rest in combinations_gen(*strings[1:]):
            yield char + rest

你可以通过迭代它的返回值来使用它:

for val in combinations_gen("ABC", "DEF"):
    print(val)

【讨论】:

  • 您好,您的以下代码不起作用。它不显示任何值。
  • def combination(*strings, prefix=""): if not strings: # 基本情况,没有字符串可供选择 print(prefix) return for char in strings[0]: # 迭代第一个字符串组合(strings[1:], prefix=prefix+char) # 递归其他字符串
  • 哦,你是对的,我在第一个代码块中有错字。您需要在递归调用中进行解包:combinations(*strings[1:], prefix=prefix+char)。在测试了我自己的代码后,我在生成器版本中修复了该错误,但在常规版本中没有。
猜你喜欢
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2013-12-19
  • 1970-01-01
  • 2018-08-12
相关资源
最近更新 更多