我一直在尝试编写一个Python程序,它使用递归函数来查找作为输入提供的两个整数之间的回文素数。回文素数的例子:313
我已经知道如何为回文编写一个递归函数,但我正在努力解决这个问题。我将不胜感激任何帮助。感谢
答案 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()
素性测试。
答案 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()
如果您对此代码的工作方式有任何疑问,请随时通过评论我的回答来询问我。祝你好运!