2016-08-14 115 views
1

我目前正在學習python從http://www.sololearn.com/Play/Python,我無法理解此代碼爲什麼工作。瞭解遞歸奇/偶函數

def is_even(x): 
    if x == 0: 
     return True 

    else: 
     return is_odd(x-1) 

def is_odd(x): 
    return not is_even(x) 

print(is_odd(1)) 

我得到了遞歸如何適用於斐波納契和階乘,但我無法用頭圍住這一個。

+4

你不明白什麼?在附註中,請不要寫這樣的代碼,這是地獄。 – Idos

+0

我剛剛在評估我腦海中的代碼時遇到了一些麻煩,我現在明白了。 我意識到這段代碼真的很糟糕,因爲它使用%操作符可以完成一些功能。 – whiteredblack

回答

1

is_even' s基本案例解析爲True。由於is_odd(x)返回not is_even(x),值True將成爲由is_odd返回的表達式的一部分。問題是True否定多少次。通過跟蹤呼叫,您可以看到它將被否定偶數次,並因此在保持其真實性時,當x是奇數時[例如:x=3 ==>(not (not (not (not True)))) == True]並且因此奇數次「丟失」其真實性,當x是偶數時[例如:x=2 ==>(not (not (not True))) == False]。可能有一些術語來自邏輯,它們命名這種多重否定的一般特性。

+1

「消除雙重否定」 – Elazar

1

它是基於均勻性的歸納定義:

  • 零甚至是
  • 如果某些數字「n」是偶數,則「N + 1」甚至不是
  • 如果某些數字「 n「不是偶數,那麼」n + 1「是偶數

」奇數「顯然是」不均勻「。

代碼採用此定義,並使用遞歸進行反向檢查。

  • ,如果我有零,那麼它甚至
  • 如果我有一些其他的數目「n」,那麼即使「N-1」不是 - 也就是,如果「N-1」很奇怪。
0

這個遞歸函數實際上是一種教遞歸的不好方法,你應該只在有用的時候才應用遞歸。事實上,用負數測試這些函數,你會得到RuntimeError: maximum recursion depth exceeded錯誤。

要檢查奇偶號碼,你最好使用%運營商或&和運營商,即:

def is_even(x): 
    return (x & 1) == 0 


def is_odd(x): 
    return (x & 1) == 1 

這麼說,我覺得@Elazar & @DAXaholic答案應該給你關於馬車遞歸函數的一些見解幷包裝你的頭腦。

+1

奇偶校驗的計算效率很高,但他們利用該表示。在這種情況下,遞歸是直接的定義,即使效率不高。 – Elazar

+0

是的,它只在自然數上定義。沒關係,可以很容易地擴展 – Elazar

+0

@Elazar你是什麼意思的直接定義?平價的最基本定義是關於定義幾套。例如:讓n是一個整數,即使= {2n}和奇數= {2n + 1},這是非常多的,你不需要將原始定義導出爲遞歸函數...恕我直言不產生任何真正的好處(甚至沒有學習) – BPL

0

一個小提示:

0 -> True 
1 -> not True 
2 -> not not True 
3 -> not not not True 
... 

等。