使用空列表作为保护条款

时间:2017-04-06 07:29:26

标签: erlang

我从erlang开始,我已经开始了一些简单的练习。在这种情况下,我正在尝试计算高斯的三角形行。我不明白为什么我会收到这个警告:

await

这个问题与护卫条款有关,但对我而言似乎是合法的xD。以下是完整的代码:

Warning: this clause cannot match because a previous clause at line 6 always matches

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

按此顺序,create_row/2函数有2种模式:

create_row([First|Rest],Current) ->

create_row([_|Rest],Current) when length(Rest)==0 ->

模式按顺序匹配。第一个模式将匹配第二个模式的所有情况,因此第二个模式永远不会被执行。

如果颠倒函数的顺序,它应该有效:

create_row([_|Rest],Current) when length(Rest)==0 -> 
  lists:append(Current,[1]);
create_row([First|Rest],Current) -> 
  io:format("rest size: ~w ~n",[Rest]),
  create_row(Rest,lists:append(Current,[First+lists:nth(1, Rest)])).

现在第一个函数只匹配长度为0的函数,第二个函数匹配其余函数。

请注意,大多数特定功能应该排在最前面。

答案 1 :(得分:3)

虽然Asier Azkuenagaanswer

中描述了警告消息的原因
create_row([_|Rest],Current) when length(Rest)==0 ->

效率低于

create_row([_],Current) ->

lists:nth(1, Rest)

效率低于

hd(Rest)

无论如何,你可能正在寻找:

create_row([]) -> [1];
create_row([H|T])->
    [H | create_row(H, T)].

create_row(X, [H|T]) ->
    [X+H | create_row(H, T)];
create_row(X, []) -> [X].

你正在制作Pascal的三角形,对吧?

18> test:create_row([]).
[1]
19> test:create_row(v(-1)).
[1,1]
20> test:create_row(v(-1)).
[1,2,1]
21> test:create_row(v(-1)).
[1,3,3,1]
22> test:create_row(v(-1)).
[1,4,6,4,1]
23> test:create_row(v(-1)).
[1,5,10,10,5,1]
24> test:create_row(v(-1)).
[1,6,15,20,15,6,1]
25> test:create_row(v(-1)).
[1,7,21,35,35,21,7,1]
26> test:create_row(v(-1)).
[1,8,28,56,70,56,28,8,1]

顺便说一下,你的代码是O(N ^ 2),因为它附加在累加器Current的末尾。

相关问题