如何为回文素数写一个递归函数?

时间:2015-05-07 20:58:01

标签: python recursion palindrome

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

我已经知道如何为回文编写一个递归函数,但我正在努力解决这个问题。我将不胜感激任何帮助。感谢

5 个答案:

答案 0 :(得分:0)

  

回文的递归功能

据推测,要递归地进行回文检查,检查外部字符:

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

现在你可以迭代数字,看看哪些是回文:

[i for i in range(n, m) if is_pali(str(i))]

答案 1 :(得分:0)

可能你已经完成了这个想法,但这就是我要做的......

如果你有像这样的回文功能:

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

让我们说你有一个函数来判断一个数字是否为素数(这是我从here获得的):

def is_prime(number):
if number > 1:
    if number == 2:
        return True
    if number % 2 == 0:
        return False
    for current in range(3, int(math.sqrt(number) + 1), 2):
        if number % current == 0: 
            return False
    return True
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)

答案 2 :(得分:0)

由于30000是限制,这是有效的(101101是它出错的最小数字):

pipe()

您当然也可以在自己的递归回文函数中使用dup2()素性测试。

http://en.wikipedia.org/wiki/Fermat_primality_test

答案 3 :(得分:-1)

而不是递归解决方案,使用更有效的列表切片呢?

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))计算。

答案 4 :(得分:-1)

此解决方案使用Sieve of Eratosthenes来查找小于n的素数。然后它使用基本的回文检查,其中哪些素数是回文。检查可以避免将int转换为str,这是一项耗时的操作。

#!/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()

如果您对此代码的工作方式有任何疑问,请随时通过评论我的回答来询问我。祝你好运!