2016-01-02 31 views
0

我無法繪製遞歸樹如下排列碼:可視化的for循環在Python

def permut(array): 

    if len(array) == 1: 
     return [array] 
    res = [] 
    for permutation in permut(array[1:]): 
     print permutation, array 
     for i in range(len(array)): 
      res.append(permutation[:i] + array[0:1] + permutation[i:]) 
    return res 

比方說,我的數組是「米克」然後我得到了以下的打印輸出的排列陣列:

k和CK

CK和ICK

KC和ICK

ICK和Mick

我理解它,直到 'K' 和 'CK'(當陣列= 'CK' LEN(arraw [1:])== 1),但我們怎樣才能永遠得到 'ICK' 爲遞歸中的數組? 你能想象這個嗎?非常感謝任何提示!

+0

可以簡單地實現。如果'array'開始作爲''mick'',那麼第一個遞歸調用被傳遞'數組[1:]',它是''ick''。如果您嘗試在紙面上手動操作算法,可能會有所幫助。另一個可能幫助的事情是將一個額外的'depth'參數傳遞給'permut',也就是用'def permut(array,depth = 0):'來定義它,並且用'遞歸地調用它來置換permut(array [1 :],depth + 1):'並將您的打印語句更改爲'打印深度,排列,數組'。 –

+0

順便說一句,'array'不是一個很棒的變量名,特別是對於一個字符串。人們會認爲它應該是一個'list',或者一個[Numpy](http://docs.scipy.org/doc/numpy-1.10.0/reference)數組,或者一個標準庫['array']( https://docs.python.org/2/library/array.html)。 –

+0

你用'array [1:]'和''mick'[1:] =='ick''調用'permut()',你的輸出是正確的。 – Zety

回答

1
permut('Mick')     # recursion: for permutation in permut('ick') 
    permut('ick')    # recursion: for permutation in permut('ck') 
     permut('ck')   # recursion: for permutation in permut('k') 
      permut('k')  # return ['k'] 
     permut('ck')   # continue from the loop 
           # print each element of ['k'] with 'ck' 
           # return res, which is ['ck', 'kc'] 
    permut('ick')    # continue from the loop 
           # print each of ['ck', 'kc'] with 'ick' 
           # return res, which is ['ick', 'cik', 'cki', 'ikc', 'kic', 'kci'] 
permut('Mick')     # continue from loop 
           # print each of the above elements + 'Mick' individually 
           # return res, which is... long 

上述基本的置換,在這個詞的字母,它可以與

>>> import itertools as it 
>>> res = list(''.join(p) for p in it.permutations('Mick')) 
>>> print res 
['Mick', 'Mikc', 'Mcik', 'Mcki', 'Mkic', 'Mkci', 'iMck', 'iMkc', 'icMk', 'ickM', 'ikMc', 'ikcM', 'cMik', 'cMki', 'ciMk', 'cikM', 'ckMi', 'ckiM', 'kMic', 'kMci', 'kiMc', 'kicM', 'kcMi', 'kciM'] 
+0

謝謝@ Reti43。我有點認爲這是繼續下去的,但是當我在for循環之後立即打印排列和數組時,我預計這兩個值均爲'k',因爲這是permut(array [1:])的返回值。那麼第一次打印的值跳到'ck'是怎麼回事?另一件事:爲什麼當permut遞歸走向另一個方向時,它會繼續回到'ick'和'Mick'? – Dora

+0

@DóraJámbor你有4個不同的函數'permut()',有不同的輸入。他們每個人都做他們自己的事情。 'print permutation'只是打印任何'permut(array [1:])'返回的每個元素。當你在'permut('ick')'時,'permutation'('ck')'的結果變成'''ck','kc']'中的排列,所以這就是打印的內容。當你調用'permut(array [1:])'時,你不會改變當前棧的'array'。我不知道這對你是否有意義。我不完全確定你感到困惑。 – Reti43

+0

@DóraJámbor但是要清楚,第一次打印'ck'就是當你在'permut('ick')'堆棧中時。這個函數之所以一直延續到'米克',是因爲這是最初的功能。當你在'permut'('Mick')時,你必須暫時停止你正在做的事情,直到你恢復'permut('ick')的結果。然後你繼續用'permut'('Mick')做的事情。把它想象成公式中的開括號和右括號。例如,(a +(b * c +(d-e))+ f)。 – Reti43