+ -
当前位置:首页 → 问答吧 → 学习perl,写了一个算24点的小程序,请前辈高手指点一下

学习perl,写了一个算24点的小程序,请前辈高手指点一下

时间:2010-07-09

来源:互联网

练习的作业,大家不要笑,总觉得写的还是C的那个套路,所以想请前辈高手指点一下


Perl code

my @test_arr=(10,4,7,6);
my @oprator_arr=('+', '-','*','/');
rec_cala(\@test_arr);

sub rec_cala
{
    my ($arr_ref) = @_;
    my @input_arr = ();
    push @input_arr,@$arr_ref;

    if (scalar(@input_arr) <= 1)
    {
        $result = eval $input_arr[0];
        if ($result > 23.9 && $result < 24.1)
        {
            print $input_arr[0];
            print "  = 24\n";
        }
    }
    else
    {
        my @perm_arr = perm(\@input_arr);

        foreach(@perm_arr)
        {
            my @next_arr = @$_;
            my $op1 = pop @next_arr;
            my $op2 = pop @next_arr;        
                        
            foreach(@oprator_arr)
            {
                @op_expr_arr = @next_arr;
                push @op_expr_arr, "($op1 $_ $op2)";
                rec_cala(\@op_expr_arr);    
            }    
            
        }
    }
}

sub perm
{
    my ($arr_ref)=@_;
    my @arr=@$arr_ref;
    my @result = [];
    
    while(scalar(@arr))
    {
        my $curr_element = pop @arr;
        my @next_step = ();
        foreach $curr_array (@result)
        {
            $curr_len = scalar(@$curr_array);
            for($i=0; $i<= $curr_len;$i++)
            {
                my @tmp = @$curr_array;            
                my @tail_arr = splice(@tmp,$i,$curr_len -$i);
                push @tmp,$curr_element;
                push @tmp,@tail_arr;
                push @next_step,[@tmp];
            }
        }
        @result =  @next_step;
    }
    return @result;
}

作者: smilefoxzy   发布时间: 2010-07-09

http://hi.baidu.com/kuaful/blog/item/21245cfa86d7a99558ee90d2.html

作者: fibbery   发布时间: 2010-07-10

算法是不分语言的。

作者: fibbery   发布时间: 2010-07-10

学习下

作者: cchb1986   发布时间: 2010-07-10

我的算法应该比楼上的简洁,不过可能效率会低一点。简单的说perm
是排列生成器,输入一个数组,给出全排列。rec_cala
是取出前两个元素,加上运算符生产一个新的表达式作为第一个元素放入数组中,这样循环调用,当数组只有一个元素时对表达式求值即可。

作者: smilefoxzy   发布时间: 2010-07-10

引用 4 楼 smilefoxzy 的回复:
我的算法应该比楼上的简洁,不过可能效率会低一点。简单的说perm
是排列生成器,输入一个数组,给出全排列。rec_cala
是取出前两个元素,加上运算符生产一个新的表达式作为第一个元素放入数组中,这样循环调用,当数组只有一个元素时对表达式求值即可。

google一下,好像还有好多。

作者: fibbery   发布时间: 2010-07-10

其实我对算法本身并不太感兴趣,只是觉得这个写法没有充分利用perl的优势

作者: smilefoxzy   发布时间: 2010-07-10

学习学习了

作者: virusHIV   发布时间: 2010-07-11

贴了这么久,没人提点意见么?

作者: smilefoxzy   发布时间: 2010-07-14