-3

这两个函数在我的 Python 编程书中,我只是不明白他们为什么要做他们正在做的事情。我真的很想了解,所以任何解释都会很棒。

def example(aString, index):
    if index == len(aString):
        return ""
    else:
        return aString[index] + example(aString, index + 1)

和...

def example(aString, index):
    if index < len(aString):
        example(aString, index +1)
        print(aString[index], end="")
4

2 回答 2

0

示例一等价于调用切片操作并指定 start 为给定索引。

例如:

>>> 'abcde'[2:] == example('abcde', 2)
True

要看到这一点,请注意该函数的工作原理。它首先根据字符串的长度检查索引是否有效。然后,如果索引有效,则返回该索引处的字符,前缀为递归调用的返回值。递归调用与原始调用相同,但它会将索引增加 1。这种情况会发生,直到函数到达基本情况,此时,它将停止进行递归调用并简单地返回其基值,即空字符串。

请注意,您仍然可以通过示例一轻松获得 IndexError ......您所要做的就是给它一个负索引或一个大于字符串长度的索引。


第二个示例以相反的顺序打印字符串的字符,直到给定索引。请注意,为元素调用它的递归调用index+1被强制在当前调用之前返回。这意味着递归调用的打印语句将在当前调用的打印语句之前执行。

也许一个例子可以帮助您可视化递归。

假设您的字符串是'abcde'You make the call example('abcde', 3)

由于 3 小于字符串的长度,它会进行递归调用:example('abcde', 4)

由于 4 小于字符串的长度,它将进行另一个递归调用:example('abcde', 5). 但是对于这个调用,你的索引不会小于字符串的长度(字符串的长度是 5),所以函数只会返回而不打印任何东西。现在函数已经返回,我们回到调用:example('abcde', 4)。现在它可以打印索引 4 处的字符,即“e”。然后该函数将返回,我们将返回调用example('abcde', 3)。它将打印索引 3 处的字符,即“d”。

最后,您对函数的原始调用将在打印“ed”后返回。

于 2013-10-14T03:26:17.833 回答
0

第一个示例,按原样返回字符串。

def example(aString, index):
    if index == len(aString):
        return ""
    else:
        return aString[index] + example(aString, index + 1)

可以说,这个函数是这样调用的

example("abc", 0)

第一个 if 条件检查索引是否超出了字符串的长度。如果是这种情况,它只会返回一个空字符串。否则,它会在 position 处获取当前字符index并使用下一个 index 调用相同的函数index + 1。这称为递归。所以会这样评价

"a" + example("abc", 1)
"a" + ("b" + example("abc", 2))
"a" + ("b" + ("c" + example("abc", 3)))
"a" + ("b" + ("c" + ""))

所以实际输出是abc.

但例如,

example("abc", 1)

将返回bc。这种行为称为切片。感谢小次郎指出。

第二个示例,仅逐个字符地打印反转的字符串。

def example(aString, index):
    if index < len(aString):
        example(aString, index +1)
        print(aString[index], end="")

这是另一个基于递归的解决方案。可以说,这个函数也是这样调用的

example("abc", 0)

if检查确保我们不会超出字符串的长度。如果条件评估为真值,那么我们立即使用下一个索引调用相同的函数(递归)。这将一直持续到我们到达字符串的末尾。当我们到达字符串的末尾时,我们将从函数返回到调用的函数。当我们到达调用的函数时,索引将为2. 所以,它会打印c,我们从那里返回到调用它的函数,它的索引为 1,所以它会打印b。这样它就会反转字符串。

与第一个示例相同的方式,我们可以像这样使用第二个示例反转字符串的最后几个字符。

example("Welcome", 3)

将打印

emoc
于 2013-10-14T03:08:52.567 回答