簡體   English   中英

包含函數的for循環如何工作?

[英]How does a for loop containing a function work?

所以我看到了這段代碼。 我知道它的作用,但是它的主要部分(for循環中的遞歸函數)使我失望。 該代碼是

    def flip(c): 
        return str(1-int(c))

    def flip_s(s, i):
         t =  s[:i]+flip(s[i])+s[i+1:]
         return t

    def hamming(s, k):
        if k>1:
           c = s[-1]

           if len(s) >= k: 
              s1=[]
              for y in hamming(s[:-1], k):
                  s1.append(y+c)
           else:
              s1=[] 

           s2 = [y+flip(c) for y in hamming(s[:-1], k-1)]

           r = []
           r.extend(s1)
           r.extend(s2)
           return r

        else:
           return [flip_s(s,i) for i in range(len(s))]

    def main():
        print(hamming('0000',2))

    main()

因此,如果我們采用第一個for循環

    s1=[]
    for y in hamming(s[:-1], k):
        s1.append(y+c)

這將如何運作? 謝謝。

與任何遞歸函數一樣,了解發生了什么的一種好方法是執行空運行:

Calling hamming with s='0000', k=2
    k is > 1
    c = '0'
    len(s) is >= 2
    s1 = []
    Calling hamming with s='000', k=2
        k is > 1
        c = '0'
        len(s) is >= 2
        s1 = []
        Calling hamming with s='00', k=2
            k is > 1
            c = '0'
            len(s) is >= 2
            s1 = []
            Calling hamming with s='0', k=2
                k is > 1
                c = '0'
                len(s) is _not_ >= k
                s1 = []
                Calling hamming with s='', k=1
                    k is _not_ > 1
                    returning []
                s2 = []
                r = []
                returning []
            Calling hamming with s='0', k=1
                k is _not_ > 1
                returning ['1']
            s2 = ['11']
            r = ['11']
            returning ['11']
        s1 = ['110']
        Calling hamming with s='00', k=1
            k is _not_ > 1
            returning ['10', '01']
        s2 = ['101', '011']
        r = ['110', '101', '011']
        returning ['10', '101', '011']
    s1 = ['100', '1010', '0110']
    Calling hamming with s='000', k=1
        k is _not_ > 1
        returning ['1100', '010', '001']
    s2 = ['1001', '0101', '0011']
    returning ['1100', '1010', '0110', '1001', '0101', '0011']
Done

因此, hamming(s, k)返回一個二進制字符串列表,該字符串的漢明距離為s ,漢明距離為k

分解遞歸函數的另一種不錯的方法是添加一個depth參數,並將其用於縮進print語句,如下所示:

def hamming(s, k, depth):
    print ' '*(4*depth) + 'hamming(' + s + ', ' + str(k) + ')'
    if k>1:
       c = s[-1]

       if len(s) >= k:
          s1=[]
          for y in hamming(s[:-1], k, depth+1):
              s1.append(y+c)
       else:
          s1=[]
       s2 = [y+flip(c) for y in hamming(s[:-1], k-1, depth+1)]

       r = []
       r.extend(s1)
       r.extend(s2)
       print ' '*(4*depth) + 'r = ' +str( r)
       return r

    else:
       x = [flip_s(s,i) for i in range(len(s))]
       print ' '*(4*depth) + 'x = ' + str(x)
       return x

結果是這樣的:

>>> hamming('1001', 2, 0)
hamming(1001, 2)
    hamming(100, 2)
        hamming(10, 2)
            hamming(1, 2)
                hamming(, 1)
                x = []
            r = []
            hamming(1, 1)
            x = ['0']
        r = ['01']
        hamming(10, 1)
        x = ['00', '11']
    r = ['010', '001', '111']
    hamming(100, 1)
    x = ['000', '110', '101']
r = ['0101', '0011', '1111', '0000', '1100', '1010']
['0101', '0011', '1111', '0000', '1100', '1010']

hamming是一個返回列表的函數。 因此,在for循環中,您要遍歷漢明返回的列表...將c添加到該列表的每個元素中,並將結果附加到s1上。

暫無
暫無

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

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