包含自身功能的函数?

时间:2017-10-26 22:55:45

标签: python python-3.x recursion key lcs

标题有点奇怪,但我不确切地知道这是怎么称呼的,所以请原谅我的抽象标题....

我在网上找到了这样的代码:

def lcs(xstr, ystr):
    """
    >>> lcs('thisisatest', 'testing123testing')
    'tsitest'
    """
    if not xstr or not ystr:
        return ""
    x, xs, y, ys = xstr[0], xstr[1:], ystr[0], ystr[1:]
    if x == y:
        return x + lcs(xs, ys)
    else:
        return max(lcs(xstr, ys), lcs(xs, ystr), key=len)

我是python的新手,我不明白如何在

中调用lcs(xs,ys)
return x + lcs(xs, ys)

根据我的理解,lcs()还没有完全定义,我很困惑如何在自己内部调用自身的函数....

另外,我不知道key = len在

中做了什么
max(lcs(xstr, ys), lcs(xs, ystr), key=len)

我知道max(1st,2nd)是如何工作的,但我不知道第三个参数是做什么的。 “密钥”是什么意思,为什么“len”被用作“密钥”的值?

1 个答案:

答案 0 :(得分:4)

这称为递归。在您调用函数之前,函数体不会被评估。把身体里的lcs想象成一个名字;当你调用该函数时,Python将应用它应用于任何名称的相同查找规则来查看它所引用的内容;通常*它指的是相同的功能。

*通常情况下,因为你可以通过玩一些带有名字的游戏来打破递归功能。

def foo():
    print("hi")
    foo()

g = foo
def foo():
    print("new function")

如果您致电g(),则会输出

hi
new function

而不是打印包含hi的无限行。 (好吧,几乎是无限的;最终你会得到RuntimeError,因为Python会限制调用堆栈的大小。)