在斐波那契数列中输出质数。

3

可以有人请检查一下我的代码吗?我在循环中提取素数时遇到了麻烦。如果用户输入5,则输出应为:2 3 5 13 89,如果用户输入7,则输出应为2 3 5 13 89 233 1597等等。

 countPrime= int(0)
 endNum= int(0)
 a0= int(0)
 a1= int(1)
 checkPrime= False
 valueN= int(input("Enter the value of N: \n"))

 while (countPrime < valueN): 
      endNum= a0 + a1
      a0= a1
      a1= endNum

      for i in range(2, endNum+1):                   # prime check 
           if (not endNum % i ==0 and endNum > 2):       #
                checkPrime= True                         #

      if(checkPrime==True):
          countPrime+=1   
          print(endNum, end=" ")

你得到了什么错误或遇到了什么问题?同时,你的while循环体没有缩进。使用正确的语法也会对沟通有很大帮助。 - KSFT
4
说“请帮我紧急求助”并不能像清晰表达问题、良好描述问题和适当格式化一样有所帮助。请提出明确的问题并描述清楚问题细节,这将更加有效。 - Wai Ha Lee
忽略缩进,我在复制粘贴时犯了一个错误。当我运行代码时,素数斐波那契数列没有显示出来,而是显示了原始的斐波那契数列。 - Jeshen Appanna
你的缩进仍然没有意义。假设你想让你的 for 循环和 if(checkPrime==True) 块在 while 循环的每次迭代中执行,那么它们需要与 while 块缩进到相同的级别。 - ali_m
1
抱歉,各位,我没有意识到缩进有错误,现在已经纠正了(粘贴不正确)。 - Jeshen Appanna
显示剩余2条评论
6个回答

4

while循环没有缩进。

如果它有缩进,它将只计算第N个斐波那契数。

在for循环中,如果该数字不可被某些数字整除,则看起来你将checkPrime = True,而这总是成立的。


1
好的,但是你的质数检查仍然“反向”,如果有任何不能被它整除的数字,它就被标记为质数。此外,在循环内部你没有重置checkPrime。 - Bjorn Munch

3

很久以前我忘记上传这段代码了。

countPrime= int(0)
checkPrime=True     
endNum= int(0)      
prevNum= int(0)         
nextNum= int(1)         
valueN= int(input("Enter the value of N: \n"))   
print("\nThe Prime numbers are: ")

def checkIfPrime(endNum):              
     sumFact=0                         
     for i in range(1, endNum+1):       
          if(endNum % i == 0):         
               sumFact+=1             
     if(sumFact==2):                   
          return True
     else:
          return False
while (countPrime < valueN):
     endNum= prevNum + nextNum        
     prevNum= nextNum                
     nextNum= endNum                  
     checkPrime= checkIfPrime(endNum)     
     if(checkPrime==True):                
          countPrime+=1                   
          checkPrime= False               
          print(endNum," ", end=" ")          

3
以下代码使用递归来输出斐波那契数列:
sequence=[0,1]
def fibonacci(num,prev, after):
    if(len(sequence) !=num):       # base case
        nextNum = prev +after           # change of state
        sequence.append(nextNum)
        fibonacci(num,after,nextNum)     # function calls itself
    return sequence

print(fibonacci(10,0,1))  # test with 10 numbers

3

这种技术利用了“元组”数据类型:

def fibonacci(n):
 a,b = 1,1
 for i in range(n-1):
 a,b = b,a+b
 return a
print fibonacci(5)      # test with 5 numbers

3
使用类可以实现以下功能:
class Fibo:
 def __init__(self, fn):
  self.fn = fn
  self.memo = {}
 def __call__(self, arg):
  if arg not in self.memo:
   self.memo[arg] = self.fn(arg)
   return self.memo[arg]

0

正如Bjorn Munch注意到的那样,您的质数检查并没有按照预期运行。您自己是否能够注意到这一点呢?使用您当前的代码可能会比较困难。但是,如果将不同的关注点分别提取为单独的函数,它们就可以进行单独的测试和验证:

import unittest

def is_prime(number):
    for divisor in range(2, number+1):
        if (not number % divisor == 0 and number > 2):
            return True
    return False

class TestIsPrime(unittest.TestCase):
    def test_0_isnt_prime(self):
        self.assertFalse(is_prime(0))

    def test_1_isnt_prime(self):
        self.assertFalse(is_prime(1))

    def test_2_is_prime(self):
        self.assertTrue(is_prime(2))

    def test_3_is_prime(self):
        self.assertTrue(is_prime(3))

    def test_4_isnt_prime(self):
        self.assertFalse(is_prime(4))

    def test_23_is_prime(self):
        self.assertTrue(is_prime(23))

    def test_25_isnt_prime(self):
        self.assertFalse(is_prime(25))

if __name__ == '__main__':
    unittest.main()

运行这个程序会给你:

...FF.F
======================================================================
FAIL: test_25_isnt_prime (__main__.TestIsPrime)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "fibprime.py", line 29, in test_25_isnt_prime
    self.assertFalse(is_prime(25))
AssertionError: True is not false

======================================================================
FAIL: test_2_is_prime (__main__.TestIsPrime)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "fibprime.py", line 17, in test_2_is_prime
    self.assertTrue(is_prime(2))
AssertionError: False is not true

======================================================================
FAIL: test_4_isnt_prime (__main__.TestIsPrime)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "fibprime.py", line 23, in test_4_isnt_prime
    self.assertFalse(is_prime(4))
AssertionError: True is not false

----------------------------------------------------------------------
Ran 7 tests in 0.000s

FAILED (failures=3)

欢迎 @JeshenAppanna。为了挑战自我,我尝试将您的代码完全转换为函数并涵盖自动测试。如果您对结果感兴趣,请告诉我,我会附上一些适合初学者的解释。 - das-g

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接