Understanding Recursion and Multiple Returns
我正在努力通过麻省理工学院6.00课程的开放式课件,我有点麻烦在递归的讲座。我想我理解基本的想法,你可以把一些问题分解成更小的,可重复的问题。我遇到的问题是理解这在实际代码中是如何工作的。有一个具体的例子我不太明白…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | def toChars(s): import string s = string.lower(s) ans = '' for c in s: if c in string.lowercase: ans = ans + c return ans def isPal(s): if len(s) <= 1: return True else: return s[0] == s[-1] and isPal(s[1:-1]) def isPalindrome(s): """Returns True if s is a palindrome and False otherwise""" return isPal(toChars(s)) |
此代码用于检查字符串是否为回文。我对ispal的工作方式有点迷茫。这是我读到的步骤…
让我困惑的是
在这一点上,我的头撞在墙上,所以任何洞察都会受到赞赏!
也许最好的方法是一步一步地使用那些让您困惑的行的值。
1 | return s[0] == s[-1] and isPal(s[1:-1]) |
假设您要测试的字符串是"abcdba",下面是调用序列
1 2 3 | return s[0] == s[-1] and isPal(s[1:-1]) #evaluate to ("A" =="A" and isPal("BCDB")) - need to go deeper return s[0] == s[-1] and isPal(s[1:-1]) #evaluate ("B" =="B" and isPal("CD")) - need to go deeper return s[0] == s[-1] and isPal(s[1:-1]) #returns ("C" =="D") |
号
注意,在最后一行中,由于短路,我们没有对ispal进行评估——我们知道,x可以是真的或是假的
在最后一行,我们有4个函数深入到
1 2 3 | def isPalindrome(s): """Returns True if s is a palindrome and False otherwise""" return isPal(toChars(s)) |
有一个解释可以帮助您理解发生了什么:
关于python中
因此,该语句不会使函数返回两个值(x和y),而是一个值(x和y的逻辑与):如果x和y都(计算为)为真,则为真。
另外,函数调用和函数调用也有区别。同一个函数可以有许多活动调用,其中包含不同的参数、局部变量等,因此它们的返回值也可以是不同的(一旦返回)。当函数调用自身时,这称为递归。当函数调用返回时,调用方继续执行,在递归的情况下,调用方可以是相同的函数(当然是不同的高层函数调用)。
我会加上我的解释,也许这对你有帮助。
首先要做的是:
1 2 3 4 5 6 7 8 | def toChars(s): import string s = string.lower(s) ans = '' for c in s: if c in string.lowercase: ans = ans + c return ans |
只需取一些文本并将其全部转换为小写,逐个字符。
接下来是:
1 2 3 4 5 | def isPal(s): if len(s) <= 1: return True else: return s[0] == s[-1] and isPal(s[1:-1]) |
。
为了理解这一部分,你问自己一个问题,什么是回文,以及知道单词或句子是一个词或句子的方法。
在这个例子中,回文的方法是:回文是一个单词或句子,在这个单词或句子中,从开始到结束的距离相同的字符是相同的字符。
那么如何检查呢?好吧,首先,如果你的单词只有一个字母或更短,那么它就是回文。
然后检查单词开头和结尾的字母是否相同。您将结果记为"真"或"假",并从已检查过的字母中删除单词,然后重复此过程,直到单词长度不超过1个字符,并检查每个比较结果是否为"真"。
例子:
1 2 | Foob->foob f=b? NO, false |
例2:
1 2 3 4 5 6 | Fbof->fbof f=f? Yes, true, bo b=o? No, false. true and false = false, so the word is not a palindrome |
。
例3:
1 2 3 4 5 6 7 8 | Fobof->fobof f=f? Yes, true, obo, o=o? Yes, true b len(b) = <=1 ? Yes, true, true and true and true = true, so the word is a palindrome. |
号
希望有帮助,问你是否需要更深入的解释,我会尽力帮助你,不用担心,我在开始的时候也在和递归作斗争。
如果使用print语句在
1 2 3 4 5 6 7 8 | def isPal(s): if len(s) <= 1: return True else: print s[0],s[-1] return s[0] == s[-1] and isPal(s[1:-1]) print isPal("heeeeh") |
。
你会得到:
1 2 3 4 | h h e e e e True |
因为索引
在
1 2 3 4 5 6 7 8 | def isPal(s): if len(s) <= 1: return True else: print s[0],s[-1] return s[0] == s[-1] and isPal(s[1:-1]) print isPal("aeeeeh") |
。
你会得到:
1 2 | a h False |
。
只要