这个算法有名字吗?

Dan*_*umb 20 algorithm perl

对非描述性问题表示道歉; 如果你能想到一个更好的,我会全神贯注.

我正在编写一些Perl来实现一个算法,而我的代码却有些腥味.由于我没有CS背景,所以我的后袋里没有很多关于标准算法的知识,但这似乎是它可能的东西.

让我用隐喻来描述我在做什么:

  • 你有一个橘子传送带.橘子一个接一个地通过你.您还可以无限量供应扁平包装盒.
  • 对于每个橙子,检查它.如果腐烂,请将其丢弃
  • 如果它是好的,把它放在一个盒子里.如果您没有盒子,请抓住一个新盒子并构建它.
  • 如果盒子里面有10个橙子,请将其关闭并放在托盘上.不要构建一个新的.
  • 重复,直到你没有橙子
  • 如果你有一个带有一些橙子的构造盒子,将它关闭并放在托盘上

因此,我们有一个处理列表中项目的算法,如果它们符合某些标准,则应将它们添加到一个结构中,当它满足某些其他标准时,应该"关闭".此外,一旦处理完列表,如果存在"开放"结构,它也应该"关闭".

天真地,我假设算法由一个循环作用于列表,一个条件用于查看列表元素是否属于结构,还有一个条件用于查看结构是否需要"关闭".在循环之外,还有一个条件来关闭任何未完成的结构.

所以,这是我的问题:

  1. 这是一个众所周知的算法的描述吗?如果是这样,它有名字吗?
  2. 是否有一种有效的方法可以将"关闭盒子"活动合并到一个地方,而不是一次在循环内部和一次在循环之外?

我将此标记为"Perl",因为Perlish方法很有意思,但我很想知道任何其他语言都有这方面的解决方案.

The*_*aul 9

它与功能方法非常契合 - 您可以迭代Oranges流,测试,分组和操作它们.在Scala中,它会是这样的:

 val oranges:Stream[Oranges] = ... // generate a stream of Oranges

 oranges.filter(_.isNotRotten).grouped(10).foreach{ o => {(new Box).fillBox(o)}}
Run Code Online (Sandbox Code Playgroud)

(grouped最后用部分方框做对了)

可能有Perl等价物.


DVK*_*DVK 5

是否有一种有效的方法可以将"关闭盒子"活动合并到一个地方,而不是一次在循环内部和一次在循环之外?

是.只需在"结构需要关闭"功能中添加"......或没有更多的橙子".执行此操作的最简单方法是do/while构造(从技术上讲,它不是Perl中的循环,尽管它看起来像一个):

my $current_container;
my $more_objects;
do {
    my $object = get_next_object();  # Easiest implementation returns undef if no more 
    $more_objects = more_objects($object) # Easiest to implement as "defined $object"
    if (!$more_objects || can_not_pack_more($current_container) { 
        close_container($current_container);
        $current_container = open_container() if $more_objects;
    }
    pack($object, $current_container) if $more_objects;
} while ($more_objects);
Run Code Online (Sandbox Code Playgroud)

恕我直言,如果close_container()被封装到一个方法中,这并没有真正赢得任何东西- 在循环内外调用它没有重大的技术或代码质量成本.实际上,我强烈认为像上面提到的一个复杂的解决方法是WORSE代码质量明智而不是直截了当:

my $current_container;
while (my $more_objects = more_objects(my $object = get_next_object())) {
    if (can_not_pack_more($current_container)) { # false on undef
        close_container($current_container);
    }
    $current_container = open_container_if_closed($current_container); # if defined
    pack($object, $current_container);
}
close_container($current_container);
Run Code Online (Sandbox Code Playgroud)

  • 澄清对观众中非perlheads的评论:当然`do` /`while`"在实际意义上是一个循环",但`do`-block不是一个"循环块",目的是循环控制动词,如`next`和`last`.它只是一个`do BLOCK`恰好由statement-modifier`while`管理. (3认同)