0
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 并且什么都不会改变

4

3 回答 3

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内置类型也是如此

于 2013-11-08T22:10:15.623 回答
1

任何调用自身的函数在技术上都是递归函数。

任何检查其参数是否为“基本情况”的函数,或者使用其参数的“较小”版本调用自身,都是一个有用的递归函数。

当然,递归函数仍然可能被破坏,甚至毫无意义。例如,考虑这个函数:

def recursive_length(a):
    if not a:
        return 0
    return 0 + recursive_length(a[1:])

我在最后一行的愚蠢错误并不意味着这不是递归函数。我递归地总结了 N 份数字0,而不是 N 份数字1,所以我可以通过写来完成同样的事情return 0。但这只是因为 N 个副本的总和0always 0,而不是因为我的函数无法递归。

那么,如果基本情况出现问题怎么办?

def recursive_length(a):
    if a is not None:
        return 0
    return 1 + recursive_length(a[1:])

现在,它实际上从未递归……但它仍然是一个递归函数。它只是一个递归函数,在基本情况下有一个错误。

于 2013-11-08T22:21:37.593 回答
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))
于 2013-11-08T22:28:50.117 回答