2017-10-26 18 views
1

タイトルは少し奇妙ですが、私はこれが呼び出された方法を正確に知っているので、plzは抽象的なタイトルで私を許していない....自身の機能を含む関数?

私はこのオンラインのようなコード発見しました:

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へ

return x + lcs(xs, ys) 

(中LCS(XS、YS)を呼び出すことができる方法を理解していない、と私は」自分自身の中で自分自身の機能をどのように呼び出すことができるのか混乱しています....

はまた、私は私がどのように機能するかをMAX(第一、第二)知っている= lenが

max(lcs(xstr, ys), lcs(xs, ystr), key=len) 

に何をしているかのキーを知らないが、私は三番目のパラメータが何をしているのか分かりません。 「キー」は何を意味し、「キー」の値として「len」が使用されるのですか?

+1

https://en.wikipedia.org/wiki/Recursion_(computer_science) – wwii

+0

*定義する*関数自体は定義されていません。しかし、関数*はあなたが呼び出すときに*定義されているので、 'NameError'はありません。 –

答えて

4

これは再帰と呼ばれます。あなたがそれを呼び出すまで、関数の本体は全く評価されません。体の中のlcsを単なる名前と考えてください。関数を呼び出すと、Pythonはそれが参照するものを見るためにどの名前にも適用される同じルックアップ規則を適用します。通常は同じ機能を指します。


*通常、名前を持つゲームをいくつか再生して再帰関数を破ることができるためです。

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

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

あなたがg()を呼び出した場合、それは代わりに、印刷の出力

hi 
new function 

hiを含む行の無限の流れになります。 (まあ、ほとんど無限;最終的にはRuntimeErrorになるでしょう。なぜなら、Pythonは呼び出しスタックのサイズを制限しているからです)。

+0

また、最大機能の第3パラメータが何をしているのか説明できますか? –

+1

あなたはそれを別の質問として尋ねるべきです。 (または、より良いのは、 'max'関数のドキュメントを読んでください。) – chepner

関連する問題