Erlang:确定素数的函数,真或假

时间:2015-09-16 02:59:58

标签: recursion erlang

所以我是Erlang的新手。 我已经多次搜索了我的问题

我正在创建一个应该取数字(N)的函数,如果是Prime数则返回true,否则返回false。在过去的几天里我一直在考虑它(就像我说的,我是Erlang的新手)并做了一些谷歌搜索。这是我到目前为止的代码:

 -module(isPrime).
 -export([isPrime/1]).

 isPrime(0)-> false;
 isPrime(1)-> false;
 isPrime(2)-> true;


 isPrime(N)->
  chPrime = N rem 2,
  if 
    chPrime = 1 -> false; %% illegal guard expression
    true->isPrime(N-1)
end.

它不完整,但我只是试图运行它以查看它是如何工作但我一直在:

isPrime.erl:11: illegal guard expression

我知道Erlang中的语句是否有某些限制,如果其他编程语言中的语句没有(当我在谷歌搜索时),但我不确定如何编写if语句,所以N rem 2实际上是完成。

有关如何重写if语句以使N rem 2正常工作的任何建议吗?非常感谢你。

2 个答案:

答案 0 :(得分:1)

" ="用于模式匹配或赋值你应该使用比较运算符" =="

isPrime(N)->
  chPrime = N rem 2,
  if
    chPrime == 1 -> false; %% fixes illegal guard expression
    true->isPrime(N-1)
end.

但" chPrime"不是erlang中的变量。 erlang中的所有变量必须以大写字母开头。

isPrime(N)->
  ChPrime = N rem 2,
  if
    ChPrime == 1 -> false;
    ChPrime =:= 1 -> true
end.

我会使用case语句重写isPrime函数。

isPrime(N) ->
    case (N rem 2) =:= 0 of
        true -> true;
        _ -> false
    end.

case语句允许你在function子句中使用模式匹配和保护,而if语句只评估一系列保护,没有模式匹配。

你应该使用Recursion来重复动作,但如果你只是想确定一个数字是素数,你就不会看到任何重复动作。

答案 1 :(得分:0)

完成之前的评论。这段代码将为你修复它。在我调试它之后,我意识到你的chPrime的if语句必须为0才能说错。否则它总是会说错。 和指南:erlang中的变量必须在开始时用大写字母定义。

    ChPrime == 0 -> false;

如果我们想在这里使用数学,我们也可以使用它。

isPrime(N) -> isPrime(N,2).
isPrime(N,N) -> true;
isPrime(N,M)->
  ChPrime = N rem M,
  if 
    ChPrime == 0 -> false;
    true -> isPrime(N,M+1)
end.