如何使用递归来使用Python查找回文?

我刚刚开始探索编程的奇迹。我正在尝试编写一个代码来识别数字回文。只是看数字而不是文本。我正试图在这里学习使用递归。但我只是没有到达任何地方,我无法弄清楚它有什么问题。 我的想法是检查第一个字符串与最后一个字符串,然后删除这两个匹配,并重复。最终没有任何东西(暗示它是回文)或者会有一对不匹配(暗示相反)。 我知道有更好的代码可以找到回文,但我只是想尝试一下递归。 那有什么不对?
def f(n):
    global li   
    li=list(str(n))
    if (len(li)==(1 or 0)):
        return True
    elif li[len(li)-1]==li[0]:
        del li[0]
        del li[len(li)-1]
        if len(li)==0:
            return True
        if len(li)>0:
            global x
            x=''.join(li)
            str(x)
            f(x)
    else:
      return False
提前致谢!     
已邀请:
一些评论 为什么
x
li
全局?在递归中,所有变量都应该是本地的。 你为什么要在
str
list
之间来回转换?你可以下标两个 您需要返回递归调用的结果:
return f(x)
试试这些建议,看看它是如何运作的。     
在深入研究之前,
if (len(li)==(1 or 0)):
并没有做你期望它做的事情。
(1 or 0)
将始终评估为
1
。 你可能想要:
if len(li) in (1, 0):
    
您的解决方案存在一些问题。让我逐行分析它们。 如果您不打算在函数范围之外更改变量,则不需要
global
语句。因此,我从代码中删除了两行
global
li=list(str(n))
:将字符串转换为列表是不必要的,因为Python中的字符串具有与不可变列表类似的接口。所以一个简单的
li = str(n)
就足够了。
if (len(li)==(1 or 0)):
:虽然它看起来不错,但实际上这是一种将值与其他几个值进行比较的错误方法。
or
运算符从其左或右操作数返回第一个“true”值,因此在这种情况下它总是返回
1
。相反,您可以使用
in
运算符,它检查左操作数是否是右操作数的元素。如果我们将正确的操作数设为元组
(1, 0)
,那么一切都会好的。此外,围绕
if
声明不需要括号。你应该写:
if len(li) in (1, 0):
elif li[len(li)-1]==li[0]:
很好,但是我们可以在Python中写得更短,因为它支持负列表索引:
elif li[-1] == li[0]:
因为我们不使用列表(可变序列),因为第2点,我们不能对它们做
del li[0]
。无论如何,删除列表的第一个元素在Python中是非常低效的(必须复制整个列表)。出于同样的原因,我们做不到
del li[len(li)-1]
。相反,我们可以使用“拼接”运算符从字符串中提取子字符串:
li = li[1:-1]
if len(li)==0:
是不必要的。在Python中,如果使用
if
进行测试,空字符串和列表将解析为False。所以你可以写
if not li:
if len(li)>0:
:你不必再检查
li
是否为空 - 你在第6点检查了它。所以一个简单的
else:
就足够了。或者甚至更好,完全删除此行并取消其余功能,因为6.19中的
if
的主体包含
return
。因此,如果我们没有进入
if
,我们就会在
else
中完全不写。
x=''.join(li)
:我们不需要将字符串转换为字符串,因为在2中做出了决定。删除此行。
str(x)
:这一行在你的代码中没有做任何有用的事情,因为
str()
不会修改它的参数,而是返回一个新的值(所以
x = str(x)
会更有意义)。你也可以删除它。
f(x)
:这是在Python中调用递归函数的有效方法,但是你必须对它的值做一些事情。也许回来吧?我们将它改为:
return f(li)
(因为我们不再有
x
变量)。 我们最终得到以下代码:
def f(n):
    li = str(n)
    if len(li) in (1, 0):
        return True
    elif li[-1] == li[0]:
        li = li[1:-1]
        if not li:
            return True
        return f(li)
    else:
        return False
这几乎是我们所需要的,但仍然可以进行一些改进。如果你看看
if not li: return True
的线条,你会发现它们没有必要。如果我们删除它们,那么将使用空字符串作为参数调用
f
len(li)
将等于0并且无论如何都将返回
True
。所以我们将继续删除这些行:
def f(n):
    li = str(n)
    if len(li) in (1, 0):
        return True
    elif li[-1] == li[0]:
        li = li[1:-1]
        return f(li)
    else:
        return False
就是这样!祝你成为一名成功的程序员!     
将整个节目分成一个列表,然后只需:
def fun(yourList):
    if yourList.pop(0) == yourList.pop(-1):
        if len(yourList) < 2:
            return True # We're a palindrome
        else:
            return fun(yourList)
    else:
        return False # We're not a palindrome

print "1234321"
print fun(list("1234321")) # True
print "6234321"
print fun(list("6234321")) # False
    
很难从代码中分辨出你打算做什么,但我写了一个更简单(也是递归)的例子,可能让你更容易理解:
def is_palindrome(num):
    s = str(num)
    if s[0] != s[-1]:
       return False
    elif not s[1:-1]:
       return True
    else:
       return is_palindrome(int(s[1:-1]))
    
def palindrome(n):
    return n == n[::-1]
    
number = int(raw_input("Enter a number: "))

rev = 0
neg = number

original = number


if (number < 0):
    number = number * -1

else:

    number = number

while ( number > 0 ):

     k = number % 10

     number = number / 10

     rev = k + ( rev * 10 )

     if (number < 1):
         break

if ( neg < 0 ):
    rev =  ( rev * -1)

else:

    rev = (rev)

if ( rev == original):

    print "The number you entered is a palindrome number"

else:

    print "The number you entered is not a palindrome number"
这个代码甚至适用于我在编程时出现任何错误的负数 别介意     

要回复问题请先登录注册