学习perl,写了一个算24点的小程序,请前辈高手指点一下
时间:2010-07-09
来源:互联网
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
作者: fibbery 发布时间: 2010-07-10
作者: fibbery 发布时间: 2010-07-10
作者: cchb1986 发布时间: 2010-07-10
是排列生成器,输入一个数组,给出全排列。rec_cala
是取出前两个元素,加上运算符生产一个新的表达式作为第一个元素放入数组中,这样循环调用,当数组只有一个元素时对表达式求值即可。
作者: smilefoxzy 发布时间: 2010-07-10
我的算法应该比楼上的简洁,不过可能效率会低一点。简单的说perm
是排列生成器,输入一个数组,给出全排列。rec_cala
是取出前两个元素,加上运算符生产一个新的表达式作为第一个元素放入数组中,这样循环调用,当数组只有一个元素时对表达式求值即可。
google一下,好像还有好多。
作者: fibbery 发布时间: 2010-07-10
作者: smilefoxzy 发布时间: 2010-07-10
作者: virusHIV 发布时间: 2010-07-11
作者: smilefoxzy 发布时间: 2010-07-14
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28