Python函数返回True或1作为无,而正确返回False和0

问题描述:

我有一个程序,执行简单的回文检查,通过比较字符串的每个末端,然后递归地执行原始字符串的子字符串。也就是说,我比较str [0]和str [-1],做一个str [1,-1]并重复比较。我在遍历代码时发现的是,当我要求函数check_palin()返回1时,它返回None。我可以清楚地看到它'执行'返回语句,但是当我要求它返回1时它总是返回无。但是,它返回0正确。在返回True/False时观察到同样的行为。这是我的代码。我究竟做错了什么??Python函数返回True或1作为无,而正确返回False和0

def check_palin(s): 
    global init 
    print("Init is %d" %(init)) 
    if len(s) <= 1 : 
     if not init : 
      print("returning 1") 
      return True 
     else : 
      print("Please supply a string of atleast 2 characters! Exiting...\n") 
      print("returning 0") 
      return False 
    else : 
     init = 0 
     if first_word(s) == last_word(s) : 
      check_palin(middle(s)) 
     else : 
      print("returning 0") 
      return False 


def first_word(s) : 
    return s[0] 

def last_word(s): 
    return s[-1] 

def middle(s): 
    return s[1:-1] 

init = 1 
s = raw_input("Please enter a string") 
print(check_palin(s)) 
if not check_palin(s) : 
    print ("String %s IS NOT a palindrome!" %(s)) 
else : 
    print ("String %s IS a palindrome!" %(s)) 

Output: 
Please enter a stringababa 
Init is 1 
Init is 0 
Init is 0 
returning 1 
None 
Init is 0 
Init is 0 
Init is 0 
returning 1 
String ababa IS NOT a palindrome! 

Process finished with exit code 0 
+0

在Python中检查s是否是回文的更简单方法是s == s [:: - 1]。它反转字符串并将其与原始字符串进行比较。我认为这更“pythonic”。您不必像许多低级语言一样按索引检查索引。 – 2015-02-05 21:57:38

+1

我正在使用这个,作为更多的方式来编写递归函数。 。但这是一个相当整洁的把戏!谢谢! – 2015-03-24 21:46:21

你忘了来回报您的递归的结果。

if first_word(s) == last_word(s) : 
     return check_palin(middle(s)) 
+5

这很常见,这个错误应该有一个名字,比如Fundamental Recursion Error。 – 2015-02-05 21:39:11

+1

“默认用户否定功能使用合同功能障碍Ur-Problem” – 2015-02-05 21:42:20

+0

哦,小子!这是一个新手的错误,好吧!非常感谢!现在让我去隐藏自己的耻辱...... – 2015-02-05 21:43:22