python - 不确定是否递归

时间:2013-11-08 22:08:22

标签: python algorithm recursion

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,并且不会发生任何变化

3 个答案:

答案 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))