Erlang:打印第一个参数和第二个参数之间的素数列表
Posted
技术标签:
【中文标题】Erlang:打印第一个参数和第二个参数之间的素数列表【英文标题】:Erlang: Print a List of Prime Numbers between first parameter and second 【发布时间】:2015-12-13 19:31:54 【问题描述】:我是 Erlang 的新手,只是有一个问题。 我已经在 *** 上查看过这里并进行了很多谷歌搜索。
我正在尝试编写一个函数,它接受两个参数并返回它们之间的质数。我最大的问题是素数测试(检查一个数字是否是素数)。其余的东西我稍后再修。
这是我目前的代码:
-module(ListPrime).
-export([primeList/2]).
primeList(0, 0)->
io:format("No prime numbers here ~s~n", [0]);
`
primeList(Start, Finish)->
CheckPrime = Finish rem Start,
if
Start =< Finish, CheckPrime == 1 -> primeList(Start, Finish-1)
end.
基本上我想做的是:
检查 Finish 是否为质数。
如果没有,请转到下一个数字 (Finish-1)。
继续直到达到基本情况。
它可以编译,但它显然没有做我想要它做的事情,因为 我不知道如何检查一个数字是否是素数。
我知道质数的定义是什么(一个只能被自身和 1 整除的数),但是当我想到这个定义时,我想到的唯一要写的是:
Finish rem Finish
并且代码行适用于任何使用的数字。如何在 Erlang 中检查一个数字是否为素数?非常感谢。
【问题讨论】:
在 SICP 中有一个关于这个的讨论,很容易翻译成 Erlang。 mitpress.mit.edu/sicp/full-text/book/… 素性测试是一个活跃的研究领域。 看here。 【参考方案1】:下面的代码将测试一个数字是否是素数。只需调用函数 isPrime,它将返回 true 或 false。
-module(isPrime).
-export([isPrime/1]).
isPrime(0)-> false;
isPrime(1)-> false;
isPrime(2)-> true;
isPrime(N)->
ChPrime = N rem 2,
if
ChPrime == 1 -> false;
ChPrime =:= 1 -> true
end.
【讨论】:
这似乎只是为了检查被 2 整除,并且知道几个数字的测试值。带有两个不同相等运算符的 if 语句对我来说没有多大意义。【参考方案2】:试试这个,我希望它能正常工作,只需调用函数prime
,它就会返回false
的true
:
divisors(N) ->
[ X || X <- lists:seq(1,N), (N rem X)==0].
prime(N) when N == 0; N == 1 ->
false;
prime(2) ->
true;
prime(N) ->
divisors(N) == [1,N].
【讨论】:
这可能有效。很简单,二人的从句似乎是不需要的。有更快的算法。【参考方案3】:试试这个:
prime([X|_]) when X =< 1 -> error(not_a_prime);
prime([X|Ns]) -> [N || N <- Ns, N rem X /= 0].
【讨论】:
这似乎只是从 Ns 中提取不能被 X 整除的元素。【参考方案4】:你需要一个调用函数! 就这样做吧:
%% caller function
run(X, Y) ->
prime(lists:seq(X, Y)).
%% prime function
prime([X|_]) when X =< 1 -> error(not_a_prime);
prime([X|Ns]) -> [N || N <- Ns, N rem X /= 0].
lists:seq(X, Y) :=
在两个数字之间创建一个列表
【讨论】:
【参考方案5】:这可能不是设置函数的最有效方式,但它确实有效:
prime(2)->true;
prime(N)when N rem 2 =:= 0-> false;
prime(3)->true;
prime(Odd)->prime(Odd,3).
prime(N,I)when N rem I =:= 0->false;
prime(N,I)when I*I > N->true;
prime(N,I)->prime(N,I+2).
primes(Start,Finish)->[X|| X <- lists:seq(Start,Finish), prime(X)].
【讨论】:
以上是关于Erlang:打印第一个参数和第二个参数之间的素数列表的主要内容,如果未能解决你的问题,请参考以下文章