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 " = 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++) { 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上下文中评估时(数字比较运算符如< =强加),计算为数组的大小.因此标量()是多余的. 稍后要添加的内容 – 必须运行