【问题标题】:Question about string permutation using Recursion关于使用递归的字符串排列的问题
【发布时间】:2020-03-05 16:37:26
【问题描述】:

这与递归有关。 s 是字符串'abc'。

返回 s 的所有排列。所以想要的输出是:['abc', 'acb', 'bac', 'bca', 'cab', 'cba']。 但我无法理解以下代码中的行:

"for perm in permute(s[:i] + s[i+1:]):"

"s[:i] + s[i+1:]" 的第一个打印语句中,它打印出“c”而不是“bc”。我认为由于索引 i 从 0 开始(其中 i = 0 和 let = "a"),"s[:0] + s[o+1:]" 将变为 s[1:]

应该返回“bc”,因为“b”在索引 1 处,而 c 是最后一个字母。但是 print 语句却返回了 "c"。

def permute(s):
    out = []

    # Base Case
    if len(s) == 1:
        out = [s]

    else:
        # For every letter in string
        for i, let in enumerate(s):

            # For every permutation resulting from Step 2 and 3 described above
            for perm in permute(s[:i] + s[i+1:]):
                print('s is ' + s)
                print('s[:i] + s[i+1:] is ' + str(s[:i] + s[i+1:]))
                print('i is ' + str(i))
                print('Current letter is ' + let)
                print('Current perm is ' + perm)

                # Add it to output
                out += [let + perm]
                print('out is ' + str(out))
                print()

    return out          

permute('abc')

s is bc
s[:i] + s[i+1:] is c
i is 0
Current letter is b
Current perm is c
out is ['bc']

s is bc
s[:i] + s[i+1:] is b
i is 1
Current letter is c
Current perm is b
out is ['bc', 'cb']

s is abc
s[:i] + s[i+1:] is bc
i is 0
Current letter is a
Current perm is bc
out is ['abc']

s is abc
s[:i] + s[i+1:] is bc
i is 0
Current letter is a
Current perm is cb
out is ['abc', 'acb']

s is ac
s[:i] + s[i+1:] is c
i is 0
Current letter is a
Current perm is c
out is ['ac']

s is ac
s[:i] + s[i+1:] is a
i is 1
Current letter is c
Current perm is a
out is ['ac', 'ca']

s is abc
s[:i] + s[i+1:] is ac
i is 1
Current letter is b
Current perm is ac
out is ['abc', 'acb', 'bac']

s is abc
s[:i] + s[i+1:] is ac
i is 1
Current letter is b
Current perm is ca
out is ['abc', 'acb', 'bac', 'bca']

s is ab
s[:i] + s[i+1:] is b
i is 0
Current letter is a
Current perm is b
out is ['ab']

s is ab
s[:i] + s[i+1:] is a
i is 1
Current letter is b
Current perm is a
out is ['ab', 'ba']

s is abc
s[:i] + s[i+1:] is ab
i is 2
Current letter is c
Current perm is ab
out is ['abc', 'acb', 'bac', 'bca', 'cab']

s is abc
s[:i] + s[i+1:] is ab
i is 2
Current letter is c
Current perm is ba
out is ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']

【问题讨论】:

  • 第一个输出行是s is bc,它解释了其余部分。此输出的原因是内部 for 循环在第一个 prints == 'abc' 发生之前递归调用 permute

标签: python recursion


【解决方案1】:

这真是一个 cookie 练习题。所以...

for i, let in enumerate(s): 为第一个值提供 0 a 然后将其传递给 Permute for 循环...

[0 a,1 b,2 c] 这些是此时循环中的值

"for perm in permute(s[:i] + s[i+1:]):

在你身上调用函数 permute() 是对的,它通过了 bc 它再次调用 enumerate('bc') 0 b 作为第一个值,然后将其传递给... permute

[0 b,1 c] 这些是此时循环中的值

"for perm in permute(s[:i] + s[i+1:]):

看看发生了什么? 它调用函数 permute() on...c !这是我们试图到达的地方。 c 是第一个烫发,因为它是 len(s)==1 在一开始就被添加到 out 中。绝对不是一个容易的问题。 编辑:

permute 函数获取字符串 s 并将其拆分为从 s 开始到 i 索引的片段,即 s[:i],另一部分是 s[i+1:],即 i+1到字符串的末尾。所以在 i 为 0 的 bc 上,它需要 s[:0] 空字符串和 s[0+1:] ,它是索引 1 到末尾,它只是 c 并对其进行置换。 s 现在长度为 1,这意味着它存储在 out 中。 i 为零 abc-> bc i 为零 bc-> c。 i 为 0 且 let=b 且 perm =c 然后当 i=1 时 let 为 c 且 perm=b 。

我想到了一些可以让你更好地理解这段代码的东西。你应该在这样的位置添加一个打印语句。

    # Base Case
if len(s) == 1:
    print('Length is 1 s=',s)
    out = [s]

我认为因为这被省略了,所以很难看到它何时需要调用排列。

【讨论】:

  • 现在更有意义了。你能解释一下为什么第一个烫发是“c”而不是“b”吗?如果 s 是 "bc" 那么 "for perm in permutate("bc")" 语句不应该返回 "b" 作为第一个 perm 项吗?
  • 当 s=bc 它在 bc 上递归,当 i 为零时 s=c 然后当 i 为 1 并且 let 是 c 然后 s=b 因为当 s=bc 时 s[:i]+s [i+1:]=b
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 2015-03-07
  • 1970-01-01
  • 2017-01-18
  • 2012-08-24
  • 1970-01-01
相关资源
最近更新 更多