我从erlang开始,我已经开始了一些简单的练习。在这种情况下,我正在尝试计算高斯的三角形行。我不明白为什么我会收到这个警告:
await
这个问题与护卫条款有关,但对我而言似乎是合法的xD。以下是完整的代码:
Warning: this clause cannot match because a previous clause at line 6 always matches
有什么想法吗?
答案 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)
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
的末尾。