2010年6月28日月曜日

[HOP] partition problemのコード

単独のreturnが参考になった。

use strict;
use warnings;
use Data::Dumper;

sub partition{
    my ($target, $treasures) = @_;

    return [] if $target == 0;     #anon. array ref
    return () if $target < 0 || @$treasures <= 0; # empty list
    # ここはPerlの作法に詳しくないと謎。
    # 一般的に、エラーケースではempty listを返すのが普通。
    # 空リストを明示的に書かずに、単独のreturnでよいかもしれない
    # (呼び出し元がリストコンテキストなら空リストになるから)

    my ($first, @rest) = @$treasures;
    my @solutions = partition($target - $first, \@rest);
    return ((map {[$first, @$_]} @solutions), partition($target, \@rest));
    # この文も実は難しい。mapの結果は、@solutionsがarray refならリスト、
    # empty listなら空リストになる性質がある。
}

print Dumper(partition(5, [1,2,3,4]));

0 件のコメント:

コメントを投稿