【问题标题】:erlang - is it possible to output the list length after having it run a quicksort?erlang - 运行快速排序后是否可以输出列表长度?
【发布时间】:2017-08-19 01:43:09
【问题描述】:

我是 Erlang 的新手。我一直在对随机的数字列表进行快速排序(我也让它只保留唯一的数字,所以重复的数字不会出现在排序的列表中)。它工作正常,因为输出给出了没有重复的排序数字,但我一直试图让它不仅输出列表,还输出长度列表,这是我遇到错误的地方。

length(mod:func). 将使列表的长度在 erlang shell 中没有问题,但是在快速排序的递归之后我无法让它工作。我试过分配变量并做lists:append。我只是不知道我做错了什么。

谁能解释一下?

对不起,我忘了附上下面的代码。这是基本的快速排序。

-module(list).
-export([sort/0]).
-export([sort/1]).

sort() -> sort([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]).

sort([]) -> [];

sort([Pivot|Tail]) ->  

    sort([ X || X <- Tail, X < Pivot]) ++

    [Pivot] ++

    sort([ X || X <- Tail, X > Pivot]).

当我在 shell 中运行它时,列表很好。如果我运行长度函数,它会给出我想要的 9。

55> c(list).    
{ok,list}
56> list:sort().
[1,2,3,4,5,6,9,10,11]
57> length(list:sort()).
9

但我试图让它只做list:sort(),然后立即给出列表和列表的长度。我尝试了很多不同的东西,并且尝试查找它,但似乎无法找到如何将两者结合到一个模块中以协同工作。看起来长度 BIF 是非常简单的功能,我只是没有以正确的方式使用/处理它。那有意义吗?

我希望它这样说:

55> c(list).    
{ok,list}
56> list:sort().
[1,2,3,4,5,6,9,10,11]
The length of the list is 9

【问题讨论】:

  • 请发布您编写的代码以及当前和预期的输出。
  • 对不起。我忘了这样做。我在上面编辑过。

标签: erlang quicksort


【解决方案1】:

您可以使用io:format/2 打印出列表长度。只需要修改你的 sort/0 函数来为其添加一行:

 sort() -> 
     Sorted = sort([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]),
     io:format("~p~nThe length of the list is ~w~n", [Sorted, length(Sorted)]).

【讨论】:

  • 好的。但这不会给出该特定列表的长度。我不仅尝试排序,而且更具体地这样做是为了只有一个唯一值列表。所以我想要唯一值列表的长度。所以在我的例子中,我想要一个长度为 9 的输出。但是上面的长度不会是 15 吗?
  • 快速排序的结果将分配给第一行的Sorted,因此它将具有所需列表的值和长度。
  • @chitown88, 但是上面的长度不会是15吗?-没有。答案就是在 sort/0 函数的第一行添加一个变量,该变量存储 sort/1 函数的结果。然后答案在你的 sort/0 函数中添加了第二行,它打印出存储在 Sorted 变量中的列表的长度......但你为什么不能自己尝试验证长度是 9 而不是 15?
  • @7stud,我确实在添加评论并意识到它之后立即尝试了它。我之前应该检查并尝试过。我对这一切和学习仍然很陌生。但我很欣赏你的解释。我有点需要这些解释来遵循逻辑并在我的脑海中理解它。
  • @chitown88 如果我理解正确,您希望将列表作为参数传递,并且仍然可以得到结果,对吗?在这种情况下,我会将您的 sort/1 重命名为 qsort/1,因为这是您正在使用的内部函数。然后,将你当前的sort/0 变成一个接受列表作为参数的函数,你就得到了你要找的东西。
【解决方案2】:
1> S = fun S([]) -> {[],0};                 
1> S([P|T]) ->                              
1> {Small,LSmall} = S([X || X <- T, X < P]),
1> {Big,LBig}= S([X || X <- T, X > P]),     
1> {Small ++ [P] ++ Big, LSmall+LBig+1}     
1> end.                                     
#Fun<erl_eval.30.52032458>
2> S([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]).
{[1,2,3,4,5,6,9,10,11],9}
3>

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2012-07-12
    • 2013-11-14
    相关资源
    最近更新 更多