簡體   English   中英

for循環內的遞歸(Python)

[英]Recursion inside for loop (Python)

我沒有編寫遞歸程序的經驗。 我正在嘗試找到一個遞歸解決方案,該解決方案使用 for 循環為給定的兩個字符串提供所有不同的組合。 我想找到一個在遞歸中使用 for 循環的解決方案。 對於給定的字符串 ABC,DEF。 output 必須是 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, '')

這里真的不需要遞歸,使用簡單的嵌套 for 循環(偽代碼)要容易得多:

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

對於具有兩個字符串的簡單案例,遞歸實際上沒有意義。 一對嵌套循環會容易得多。

如果您試圖解決一個更普遍的問題,即組合任意數量的字符串,那么使用遞歸更有意義。 那么遞歸與迭代相結合的一般結構將是有意義的。

我會這樣做,在第一個字符串上循環,遞歸處理剩余的字符串。 將傳遞一個僅限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

如果您不想直接在 function 中打印字符串,而是將它們返回給調用者,我會編寫一個遞歸生成器,它不需要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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM