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 中的数组,当在标量上下文中计算时(像
<=
这样的数值比较运算符强加的),计算结果为数组的大小。所以 scalar()
是多余的。更多稍后添加 - 必须运行
关于algorithm - 我怎样才能改进这个程序以得到 24 和 4 个数字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3323926/