def func_palindrome(stri):
if len(stri) == 0 or 1:
return True
if stri[0] != stri[-1]:
return False
return func_palindrome(stri[1:-1])
我不确定检查字符串是否为回文的这个函数是否可以被视为递归代码。因为我可以简单地将最后返回值从return func_palindrome(str[1:-1])
更改为True,并且不会发生任何变化
答案 0 :(得分:7)
您的问题在这里:
if len(str) == 0 or 1 :
应该是
if len(str) == 0 or len(str) == 1:
只需执行if len(str) == 0 or 1
即可评估True
总是,因为它被解释为(len(str) == 0) or 1
另外,我会将str
重命名为其他内容,因为str
是内置类型
答案 1 :(得分:1)
任何调用自身的函数在技术上都是递归函数。
任何检查其参数的“基本情况”的函数,以及用其参数的“较小”版本调用自身的函数,都是一个有用的递归函数。
当然,递归函数仍然可以被破坏,甚至是无意义的。例如,考虑这个函数:
def recursive_length(a):
if not a:
return 0
return 0 + recursive_length(a[1:])
我在最后一行中的愚蠢错误并不意味着这不是一个递归函数。我递归地总结了数字0
的N个副本,而不是数字1
的N个副本,所以我可以通过编写return 0
来完成同样的事情。但这仅仅是因为0
的N个副本的总和始终为0
,而不是因为我的函数无法递归。
那么,如果基本情况出现问题怎么办?
def recursive_length(a):
if a is not None:
return 0
return 1 + recursive_length(a[1:])
现在,它实际上从未实际递归......但它仍然是一个递归函数。它只是一个递归函数,在基本情况下有一个错误。
答案 2 :(得分:1)
你不需要递归地执行此操作,但是你可以,特别是如果你不介意很多额外的空间和长字符串的糟糕表现。
以下是两种非递归方式:
#!/usr/bin/python3
def is_palindrome1(string1):
string2_list = list(string1)
string2_list.reverse()
string2 = ''.join(string2_list)
return string1 == string2
def is_palindrome2(string):
len_string = len(string)
for index in range(len_string // 2):
character1 = string[index:index+1]
character2 = string[len_string-index-1:len_string-index]
if character1 == character2:
# This character is good
pass
else:
return False
# all characters matched
return True
for string in [ '393', '339', 'aibohphobia', 'aibobphobia' ]:
assert is_palindrome1(string) == is_palindrome2(string)
print(is_palindrome1(string))
print(is_palindrome2(string))