[英]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.