算法 – 如何改进此程序以获得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上下文中评估时(数字比较运算符如< =强加),计算为数组的大小.因此标量()是多余的. 稍后要添加的内容 – 必须运行 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |