Julia 和 Python 比较中给定两个数字之间的素数

Apo*_*s52 11 python julia

请参阅查找给定两个数字下限和上限之间的素数的 Python 代码:

\n
lower = 3\nupper = 15\n\nprint("Prime numbers between", lower, "and", upper, "are:")\n\nfor num in range(lower, upper + 1):\n\n   for i in range(2, num):\n       if (num % i) == 0:\n           break\n   else:\n       print(num)\n
Run Code Online (Sandbox Code Playgroud)\n

Python输出:

\n
lower = 3\nupper = 15\n\nprint("Prime numbers between", lower, "and", upper, "are:")\n\nfor num in range(lower, upper + 1):\n\n   for i in range(2, num):\n       if (num % i) == 0:\n           break\n   else:\n       print(num)\n
Run Code Online (Sandbox Code Playgroud)\n

Julia 中几乎类似的代码给出了错误的输出。请参阅下面的 Julia 代码:

\n
lower = 3\nupper = 15\nprintln("Prime numbers between ", lower, " and \xe2\x80\x9c, upper, " are:\xe2\x80\x9d)\nfor num in lower:upper    \n    for i in 2: num-1\n        if (num % i) == 0\n            break           \n        else\n            println(num)\n            break\n        end\n    end\nend\n
Run Code Online (Sandbox Code Playgroud)\n

朱莉娅输出:

\n
Prime numbers between 3 and 15 are:\n3\n5\n7\n11\n13\n
Run Code Online (Sandbox Code Playgroud)\n

显然,9 和 15 不是素数。为什么 Python 代码给出正确的输出而 Julia 代码却不能。有什么方法可以使用相同的算法逻辑来修复它吗?

\n

Bog*_*ski 15

这是我将使用的代码,它根据您的请求保持相同的算法逻辑(我以这种方式编写此代码,因为循环内的条件不仅有效而且读取自然:“范围中的任何数字除以2:num-1num打印num”):

julia> lower = 3
3

julia> upper = 15
15

julia> println("Prime numbers between $lower and $upper are:")
Prime numbers between 3 and 15 are:

julia> for num in lower:upper
           any(i -> num % i == 0, 2:num-1) || println(num)
       end
3
5
7
11
13
Run Code Online (Sandbox Code Playgroud)

根据 Julia 对您问题的评论,您没有循环else子句for。然而,使用该any函数与您的代码保持相同的逻辑,因为它是一个短路函数(达到与breakfor 循环相同的效果)。

如果我的代码中有任何不清楚的地方,请告诉我。


编辑:

我将重写代码来解释它是如何工作的。

首先是||部分。它利用了算子的短路||行为。所以在第一层,这可以重写为:

julia> lower = 3
3

julia> upper = 15
15

julia> println("Prime numbers between $lower and $upper are:")
Prime numbers between 3 and 15 are:

julia> for num in lower:upper
           iscomposite = any(i -> num % i == 0, 2:num-1)
           if !iscomposite
               println(num)
           end
       end
3
5
7
11
13
Run Code Online (Sandbox Code Playgroud)

现在,正如所评论的那样,any也进行了短路,因此它相当于编写:

julia> lower = 3
3

julia> upper = 15
15

julia> println("Prime numbers between $lower and $upper are:")
Prime numbers between 3 and 15 are:

julia> for num in lower:upper
           iscomposite = false
           for i in 2:num-1
               if num % i == 0
                   iscomposite = true
                   break
               end
           end
           if !iscomposite
               println(num)
           end
       end
3
5
7
11
13
Run Code Online (Sandbox Code Playgroud)