我无法完全围绕这两个功能

时间:2013-10-14 03:06:29

标签: python

这两个函数都在我的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="")

2 个答案:

答案 0 :(得分:0)

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

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

让我们说,这个函数就像这样调用

example("abc", 0)

第一个if条件检查索引是否超出了字符串的长度。如果是这种情况,它只返回一个空字符串。否则,它将获取位置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。此行为称为切片。感谢kojiro指出它。

第二个例子,只是按字符打印反向字符串。

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

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

example("abc", 0)

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

与第一个例子一样,我们只能用第二个例子来反转字符串的最后几个字符。

example("Welcome", 3)

将打印

emoc

答案 1 :(得分:0)

示例1相当于调用切片操作并将start指定为给定索引。

例如:

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

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

请注意,您仍然可以轻松获取带有示例1的IndexError ...您只需要给它一个负索引或一个大于字符串长度的索引。


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

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

假设您的字符串为'abcde'您拨打电话example('abcde', 3)

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

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

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