所以我是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
正常工作的任何建议吗?非常感谢你。
答案 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.