加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

算法 – 如何改进此程序以获得24个4个数字?

发布时间:2020-12-16 06:20:19 所属栏目:大数据 来源:网络整理
导读:24分是小游戏.您必须使用 – * /从4个数字中获取结果24.我写了一个Perl脚本来解决这个问题.但我觉得我的代码太长了,它看起来像C. 我希望有人能给我一些建议.非常感谢你! 其他语言也是可能的,例如Python,Scala,F#,C. my @test_arr = (10,4,7,6);my @oprator_
24分是小游戏.您必须使用 – * /从4个数字中获取结果24.我写了一个Perl脚本来解决这个问题.但我觉得我的代码太长了,它看起来像C.

我希望有人能给我一些建议.非常感谢你!

其他语言也是可能的,例如Python,Scala,F#,C.

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 "  = 24n";
        }
    } 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++) {
                push @next_step,[
                    (@$curr_array[0 .. $i],$curr_element,@$curr_array[$i + 1 .. $curr_len])
                ];
            }
        }
        @result = @next_step;
    }
    return @result;
}

解决方法

好的,两点:

1)你说“改善”.

虽然代码高尔夫是“酷”的,如果正确研究和应用,有助于开发人员增加他们的知识和沟通所选语言的细微差别和深度,从广义上讲,由此产生的高尔夫代码不是从软件开发角度的改进.视图.

虽然优秀,优雅的代码通常会导致程序更短,但相反的情况并不一定(或通常)是正确的.仅仅拥有更短代码的代码意味着代码更难以阅读并且难以维护,而这两个特性对于良好的软件开发来说至关重要.

2)话虽如此,Perl确实提供了许多语法设施和习语,可以实现更好的代码,同时将其缩短为副作用.我将尝试指出一些可能的代码更改,这些更改会使我的意见更加惯用,但不一定更短.

旧:

my @input_arr = ();
push @input_arr,@$arr_ref;

新:

my @input_arr = (@$arr_ref);

说明:您不需要声明数组并单独初始化它.

旧:

if (scalar(@input_arr) <= 1) {

新:

if (@input_arr <= 1) {

说明:Perl中的数组在scaalar上下文中评估时(数字比较运算符如< =强加),计算为数组的大小.因此标量()是多余的. 稍后要添加的内容 – 必须运行

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读