Python中递归函数的说明

时间:2018-10-04 03:27:34

标签: python recursion

我是Python的新手,正在尝试将我的头放在递归函数上。我正在理解总体概念,但是遇到了一个例子,我似乎无法完全理解它在做什么。逐步分解正在发生的事情将是理想的,请提前了解帮助。

def anagrams(s):
    if s == '':    
        return [s]
    else:
        ans = []
        for w in anagrams(s[1:]): 
            for pos in range(len(w)+1):
                ans.append(w[:pos] + s[0] + w[pos:])
    return ans  

2 个答案:

答案 0 :(得分:1)

def anagrams(s):
    # if argument <s> is a blank String
    if s == '':
        # return a list is just <s> in it
        return [s]
    else:
        # create a List
        ans = []
        # for each String character in calling this function recursively,
        # but removing character 0!
        for w in anagrams(s[1:]): 
            # for character position number starting at 0 and ending at
            # the length of the returned value of the recursed function
            # plus 1
            for pos in range(len(w)+1):
                # append a string with the following concatenation:
                # - the returned value's string from position 0 to position <pos>
                # - the character at position 0 of <s>
                # - the returned value's string from position <pos> to the end
                ans.append(w[:pos] + s[0] + w[pos:])
    # return the list
    return ans 

答案 1 :(得分:1)

if s == '':    
        return [s]

如果它是一个空字符串,则没有其他字谜,请返回仅包含该空字符串的列表。

否则,

for w in anagrams(s[1:]):

s分隔为第一个字符(s[0])和所有其他字符的子字符串(s[1:])。再次调用该函数以查找子字符串的所有字谜(那些w),

for pos in range(len(w)+1):
        ans.append(w[:pos] + s[0] + w[pos:])

然后针对其中每一个,在s中的任何可能位置(pos)插入w的第一个字符。

这是您的函数,带有一些打印语句,可帮助您了解发生了什么事情。

def anagrams(s):
    if s == '':    
        return [s]
    else:
        ans = []
        level = len(s)
        for w in anagrams(s[1:]):
            print('level %d, s[0]: %s, w: %s' % (level, s[0], w))
            for pos in range(len(w)+1): 
                ans.append(w[:pos] + s[0] + w[pos:])
    return ans 

尝试:

1。

anagrams('a')

输出:

level 1, s[0]: a, w: 

2。

anagrams('ba')

输出:

level 1, s[0]: a, w: 
level 2, s[0]: b, w: a

3。

anagrams('cba')

level 1, s[0]: a, w: 
level 2, s[0]: b, w: a
level 3, s[0]: c, w: ba
level 3, s[0]: c, w: ab