Python 如何编写回文素数的递归函数?
我一直在尝试编写一个Python程序,它使用递归函数查找作为输入提供的两个整数之间的回文素数。回文素数示例:313Python 如何编写回文素数的递归函数?,python,recursion,palindrome,Python,Recursion,Palindrome,我一直在尝试编写一个Python程序,它使用递归函数查找作为输入提供的两个整数之间的回文素数。回文素数示例:313 我已经知道如何为回文编写递归函数,但我一直在努力解决这个问题。我将感谢任何帮助。谢谢你,不用递归解决方案,使用更有效的列表切片怎么样 def isPalindrome(number): nstr = str(number) return nstr == nstr[::-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))
计算
回文的递归函数
假设要递归执行回文检查,您需要检查外部字符:
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()