2016-02-19 57 views
1

我想用Erlang来确定传递给函数的变量是否可以被数字整除。我已经考虑使用case来做到这一点,但是,解决方案已经避开了我。 case是这份工作的正确工具吗?Erlang在可分割性上切换(case)

例如:将一个数字传递给函数f()。如果数字可以被10整除,则打印一条语句。如果它能被15整除,则打印另一个声明。如果它可以被5整除,我想我要打印第三个陈述,但不是由于案件已经处理,而是'可以被10整除'或'可以被15整除'的陈述。

我的直觉告诉我case适合这份工作,但我是Erlang新手,无法拼凑在一起。

+0

如果您正在寻找类似fizzbuzz的东西,请参阅[此答案](http://stackoverflow.com/a/3249892)。 –

回答

3

你可以在你的函数使用的条款卫士做到这一点:

f(N) when N rem 10 =:= 0 -> 
    io:format("divisible by 10~n"); 
f(N) when N rem 15 =:= 0 -> 
    io:format("divisible by 15~n"); 
f(N) when N rem 5 =:= 0 -> 
    io:format("divisible by 5~n"). 

或者你可以用if表达做到这一点:

f(N) -> 
    if N rem 10 =:= 0 -> 
     io:format("divisible by 10~n"); 
     N rem 15 =:= 0 -> 
     io:format("divisible by 15~n"); 
     N rem 5 =:= 0 -> 
     io:format("divisible by 5~n") 
    end. 

如果你从别的地方获得的数量,使用case表达式可能更自然:

f() -> 
    case get_number() of 
     N when N rem 10 =:= 0 -> 
      io:format("divisible by 10~n"); 
     N when N rem 15 =:= 0 -> 
      io:format("divisible by 15~n"); 
     N when N rem 5 =:= 0 -> 
      io:format("divisible by 5~n") 
    end. 

请注意,如果数字不能被5整除,所有这些表达式都会崩溃。这在Erlang中通常被认为是很好的风格:如果你的函数不能做任何合理的输入错误,最好让它崩溃并让调用者处理错误比在每个级别上处理错误使代码复杂化。当然,这取决于您的具体要求。