我正在函数式编程课上做一个学校项目。这个项目是关于确定一组多米诺骨牌(表示为1 - 6中两个数字的元组列表)是否可以端到端放置。我对这个问题没问题,但我遇到了一个问题,lists:filter
返回的是字符串"\n\f"
,而不是文档中所说的列表。
我在网上找不到任何东西,想知道你们中是否有人有什么想法。
谢谢!
这是我的代码,问题出在check_dominos()函数中。
-module(challenge).
-export([test/0, check_dominos/1]).
% If there is an even number of each number, true
% else, false
extract_numbers([]) -> [];
extract_numbers([{First, Second} | T]) -> [First] ++ [Second] ++ extract_numbers(T).
add_matching_numbers(_Previous, []) -> [];
add_matching_numbers(Previous, [First | T]) when Previous =:= First-> [Previous + First | add_matching_numbers(First, T)];
add_matching_numbers(_Previous, [First | T]) -> add_matching_numbers(First, T).
check_dominos(Dominos) ->
All_Numbers = extract_numbers(Dominos),
Sorted_Numbers = lists:sort(All_Numbers),
Accumulated_Numbers = add_matching_numbers(0, Sorted_Numbers) ,
Filter_Lambda = fun(Num) -> Num rem 2 == 0 end,
Result = lists:filter(Filter_Lambda, Accumulated_Numbers),
Result.
% Still working on the logic of this part
%case length(Accumulated_Numbers) =:= length(Result) of
% true -> true;
% _ -> false
%end.
test() ->
Test_1 = [{1, 3}, {3, 2}, {2, 1}], % Already in order
Test_2 = [{5, 2}, {5, 6}, {6, 3}, {1, 4}], % Shouldn't work
Test_3 = [{2, 6}, {3, 5}, {1, 4}, {3, 4}, {6, 1}, {2, 5}], % Should work
true = check_dominos(Test_1),
false = check_dominos(Test_2),
true = check_dominos(Test_3).
2条答案
按热度按时间yvt65v4c1#
Erlang字符串是字符代码的列表,默认情况下,Erlangshell试图将整数列表显示为字符串。要更改此行为,请在运行程序之前调用
shell:strings(false).
。9avjhtql2#
上一个答案是正确的。任何只包含与可打印字符相对应的数字的列表都将显示为字符串。
在
Test_2
上显示为"\n\f"
,但显示为列表时显示为[10, 12]
。请尝试在交互式erlang shell中键入[10, 12].
,您确实会看到它显示"\n\f"
。请尝试:在一个交互式Erlangshell中。对我来说它显示:
试试看:
显示:
注意:数字8到13是可打印字符,数字32到255(其中一些?)也是。其中可能有一些空白。如果您想查看可打印字符的数值,请使用美元符号,例如
$\n.
打印10
。也就是说,按照目前的处理方式,
add_matching_numbers
无法得到正确的结果,只要与排序列表中的下一项不匹配,它就会丢弃一个值,这不会告诉您是否有不匹配的项,[10,12]
对List_2
的结果告诉您:与其它结果一样,它是偶数的列表。祝你好运找到你的解决方案。