2012-04-24 35 views
3

迴文是一個字符串,它讀取相同的向前和向後。迴文的例子包括「lol」,「abba」,「雷達」和「pickle elkci​​p」。指示是否它的工作原理下以下文檔字符串描述的所有情況:「」「返回True如果字符串s是一個迴文並返回否則爲false。」「」爲什麼迴文測試不起作用?

def palindrome2(s): 
    n = len(s) 
    pal = True 
    for i in range(n/2): 
     if s[i] == s[n-i-1]: 
      pal = True 
     else: 
      pal = False 
    return pal 

我不明白爲什麼這個功能止跌沒有工作。對我來說,這似乎是功能的作品。顯然,布爾錯誤被濫用,但我不明白上面的布爾錯誤如何使用不當。有人可以向我解釋這個嗎?

+0

你運行各種類型的測試方案輸入?甚至有框架可以使這更容易。 – Marcin 2012-12-19 15:21:52

回答

6

的方式循環體是編碼的pal值可以TrueFalse反覆取決於給定對字符是否發生特定迭代期間以匹配或不間切換。

更好地檢查不等式,將布爾變量pal設置爲False,然後立即退出循環。

事情是這樣的:

def palindrome2(s): 
    n = len(s) 
    pal = True 

    for i in range(n/2) 
     if s[i] != s[n-i-1]: # the moment it's false 
      pal = False  # set pal and 
      break    # drop out of the loop 

    return pal 

或者,不使用布爾變量:

... 
    for i in range(n/2) 
     if s[i] != s[n-i-1]: # the moment it's false 
      return False  # exit the function by returning False 

    return True # otherwise return True 
+1

或者,你知道,因爲它是在一個功能... – 2012-04-24 01:20:40

+0

@ IgnacioVazquez-Abrams你是指第二個備用解決方案 - 是的,這是一個乾淨的選擇,我同意。第一個與最初的代碼最接近,這就是爲什麼它在那裏。 – Levon 2012-04-24 01:26:10

+1

注意:如果您正在Python 3下運行,您需要n/2範圍爲 – rbanffy 2012-04-24 13:39:10

3

您總是檢查每一個字符。一旦知道結果,你需要立即返回。

8

爲了好玩,你也可以嘗試更簡單:

def palindrome(s): 
    return s[::-1] == s 

(運動留給讀者如何工作)

+1

您缺少'return'。 – Akavall 2012-04-24 01:27:37

+0

@Akavall好電話:)(固定) – ulmangt 2012-04-24 01:28:36

3

@ ulmangt的解決方案是很聰明,但我會用更少的神祕去:

def palindrome(s): 
    return all((s[i] == s[-(i+1)] for i in range(len(s)/2))) 

至少它的一半那麼多比較;-)

+0

優雅。 +1用於優化比較次數。 (但是在我的測試中,只要@ ulmangt的執行時間爲3.5x。) – LarsH 2013-01-03 21:00:15

+0

你也可以用'not(任何((s [i]!= s [ - (i + 1) (s)/ 2))))',當候選人不是迴文時,您將避免進行一些比較。 – rbanffy 2013-01-14 19:23:56

+0

有趣的...這不是一個列表,也不是一個集合的理解......它是什麼?它如何避免一些比較? – LarsH 2013-01-14 19:43:21

相關問題