【问题标题】:What’s wrong with my recursion for finding primes? (Python)我的寻找素数的递归有什么问题? (Python)
【发布时间】:2020-05-27 18:26:57
【问题描述】:

我正在尝试创建一个程序,列出输入数字下方的所有素数,我想出了代码:

def primes():
    num = 20

    numlist = list(range(1,num+1))
    i = len(numlist)

    for j in numlist[2:]:
        ans = divisible(j,i)

        if ans:
            numlist.remove(j)
            print(numlist)

def divisible(m,n):

    if m!=n and m%n==0:
        return True

    elif n == 1:
        return False

    else:
        divisible(m, n-1)

primes()

(我使用了浏览器内的 IDE,所以 num 部分是输入的代理。)

我的想法是创建一个单独的函数divisible(),当输入两个整数mn 时,将检查n 是否除以m。我不确定我的递归是否正确,但我写了divisible(m,n-1) 的想法是它会从n 向下迭代所有整数,如果有n 除@987654332,它将返回True @,或者False,如果它到达1

在主代码中,m 遍历了list 中的所有数字,n 是同一list 中的元素总数。我将print(numlist) 放在if 语句中作为错误检查。我遇到的问题是打印。代码实际上什么也没返回。在这里递归的工作方式有什么我遗漏的吗?

【问题讨论】:

    标签: python recursion primes


    【解决方案1】:

    这里有很多错误:

    你犯了一个常见的初学者递归错误,因为你有一个返回值的递归函数,但是当你递归调用它时,你会忽略返回的值。你需要处理它或传递它。

    这个模数好像倒退了:

    if ... and m%n==0:
    

    也许应该是:

    if ... and n % m == 0:
    

    您的代码似乎没有在计算 素数。看起来它正在计算 相对素数n

    你的号码列表从1开始:

    numlist = list(range(1,num+1))
    

    但是你从索引2开始测试:

    for j in numlist[2:]:
    

    3 是哪个数字,而你永远不会检查数字 2 的整除性。

    即使有所有这些修复,我觉得你的算法也行不通。

    【讨论】:

      【解决方案2】:

      如果你的可分割函数落入 else 部分,它不会返回任何东西。改成

      def divisible(m, n):
          if m!=m and m%n==0:
              return True
          elif n==1 :
              return False
          else:
              return divisible(m,n-1)
      

      这应该可以工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-07
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多