Python 如何编写回文素数的递归函数?

Python 如何编写回文素数的递归函数?,python,recursion,palindrome,Python,Recursion,Palindrome,我一直在尝试编写一个Python程序,它使用递归函数查找作为输入提供的两个整数之间的回文素数。回文素数示例:313 我已经知道如何为回文编写递归函数,但我一直在努力解决这个问题。我将感谢任何帮助。谢谢你,不用递归解决方案,使用更有效的列表切片怎么样 def isPalindrome(number): nstr = str(number) return nstr == nstr[::-1] 这是通过将数字转换为字符串并比较其反向对应项来实现的。还有一种已知的确定回文的算法, 使用

我一直在尝试编写一个Python程序,它使用递归函数查找作为输入提供的两个整数之间的回文素数。回文素数示例:313


我已经知道如何为回文编写递归函数,但我一直在努力解决这个问题。我将感谢任何帮助。谢谢你,不用递归解决方案,使用更有效的列表切片怎么样

def isPalindrome(number):
    nstr = str(number)
    return nstr == nstr[::-1]
这是通过将数字转换为字符串并比较其反向对应项来实现的。还有一种已知的确定回文的算法, 使用全局变量:

sum = 0


def is_palindrome(number):
    return palindrome_sum(number) == number


def palindrome_sum(number):
    global sum
    if number != 0:
        remainder = number % 10
        sum = sum * 10 + remainder
        palindrome_sum(number / 10) * 10 + remainder

    return sum
对于无全局变量的数学递归函数,可以使用此算法:

import math

def is_palindrome(number):
    return palindrome_sum(number) == number


def palindrome_sum(number, sum=0):
    iters = 0
    if number != 0:
        iters = int(math.log10(number))
        remainder = number % 10
        sum = palindrome_sum(number / 10) + remainder * 10 ** iters

    return sum
它使用数字的长度来查找它在结果数字中的位置。长度可以通过
int(math.log10(number))
计算

回文的递归函数

假设要递归执行回文检查,您需要检查外部字符:

def is_pali(s):
    if len(s) <= 1:
        return True
    else:
        return s[0] == s[-1] and is_pali(s[1:-1])

也许你已经经历过这个想法,但我会这么做

如果你有这样一个回文函数:

def palindrome(word):
if len(word) == 1 or (len(word) == 2 and word[0] == word[1]):
    return True
else:
    if word[0] == word[len(word)-1]:
        return palindrome(word[1] + word[len(word)-2])
    else:
        return False
假设你有一个函数来计算一个数是否为素数(我从中得到):

当您发现您的号码是否是回文时,您可以调用验证(首先将其转换为str)。 缺少的部分是生成可能得到的两个整数的组合,但这很简单

希望这有帮助

-编辑: 添加用于获取素数的递归函数:

def prime(number,limit = 1):
if limit == number:
    return True
else:
    if number % limit == 0 and limit != 1:
        return False
    else:
        return prime(number, limit + 1)

由于30000是极限值,因此该值有效(101101是错误的最小值):

当然,您也可以在自己已有的递归回文函数中使用
(2**n-1)%n==1
素性测试

此解决方案使用查找小于n的素数。然后,它使用一个基本的回文检查哪些素数是回文。该检查避免将
int
s转换为
str
s,这是一个耗时的操作

#!/usr/bin/env python2.7

def primeslt(n):
    """Finds all primes less than n"""

    if n < 3:
        return []

    A = [True] * n
    A[0], A[1] = False, False

    for i in range(2, int(n**0.5)+1):
        if A[i]:
            j = i**2
            while j < n:
                A[j] = False
                j += i

    return (num for num in xrange(n) if A[num])

def is_palindrome(n):
    digits = []
    while n > 0:
        digits.append(n%10)
        n /= 10
    return digits == digits[::-1]

def main():
    while True:
        try:
            i = int(raw_input("Palindromic primes less than... "))
            break
        except ValueError:
            print "Input must be an integer."

    print filter(is_palindrome, primeslt(i))

if __name__ == '__main__':
    main()
#/usr/bin/env python2.7
def primeslt(n):
“”“查找所有小于n的素数”“”
如果n<3:
返回[]
A=[True]*n
A[0],A[1]=假,假
对于范围(2,int(n**0.5)+1)内的i:
如果A[i]:
j=i**2
而j0时:
数字。追加(n%10)
n/=10
返回数字==数字[:-1]
def main():
尽管如此:
尝试:
i=int(原始输入(“回文素数小于…”)
打破
除值错误外:
打印“输入必须是整数。”
打印过滤器(是回文,素数(i))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

如果您对这段代码的工作原理有任何疑问,请随时评论我的答案。祝你好运

忽略整个素数业务-只需找出如何处理回文业务。但我还必须检查这些数字是否为素数,对吗?@John是的,但你有两个标准,一次处理一个。是的。但这是“容易”的部分
foreach(范围内的素数){check if palindrome}
^非python代码:P.//无论如何,在获得回文后,应该使用回文函数并插入
isprime
检查。如果这是非常低效的(即在
is_-pali
中),那么最后一个return语句不应该是
returns s[0]==s[-1]并且是_-pali(s[1:-1])吗
?@wflynny是的,绝对-哇!安迪,我已经有了回文函数。我的问题是修改它,以便它检查回文素数。@John这将是is_pali(str(I))部分中的str…:)谢谢你的代码。我应该使用递归函数onlytanks来进行回复。我有一个类似的回文代码。然而,检查素数的第二个不是递归的。我只需要使用递归函数,我用一个递归函数更新它来计算素数。它不是那么有效,因为它从1开始计算,直到你给出的数字,如果它是可除的,但它是有效的:-)
def prime(number,limit = 1):
if limit == number:
    return True
else:
    if number % limit == 0 and limit != 1:
        return False
    else:
        return prime(number, limit + 1)
>>> [n for n in range(2, 500) if str(n) == str(n)[::-1] and (2**n-1)%n == 1]
[2, 3, 5, 7, 11, 101, 131, 151, 181, 191, 313, 353, 373, 383]
#!/usr/bin/env python2.7

def primeslt(n):
    """Finds all primes less than n"""

    if n < 3:
        return []

    A = [True] * n
    A[0], A[1] = False, False

    for i in range(2, int(n**0.5)+1):
        if A[i]:
            j = i**2
            while j < n:
                A[j] = False
                j += i

    return (num for num in xrange(n) if A[num])

def is_palindrome(n):
    digits = []
    while n > 0:
        digits.append(n%10)
        n /= 10
    return digits == digits[::-1]

def main():
    while True:
        try:
            i = int(raw_input("Palindromic primes less than... "))
            break
        except ValueError:
            print "Input must be an integer."

    print filter(is_palindrome, primeslt(i))

if __name__ == '__main__':
    main()