将给定的四个数做四则运算,每个数只能用一次,结果得到给定的值,求该运算表达式
鸟哥的微博上看来的,代码如下:
<?php
/**
* 将给定的四个数做四则运算,每个数只能用一次,结果得到给定的值,求该运算表达式
* by wbq 2012-2-14
* $n:数组四个数可以是任意0-99
* $r:要运算的结果值
*/
$n = array(1,2,3,4);
$r = 30;
$m = 0;
$l = count($n);
get41($n,$l);
if (!$m) echo "无法计算!";
/**
* 执行四则运算的主方法-递归方法
* @param $n 要操作的数的数组,数可以为表达式
* @param $l 该数组的有意义的元素的个数
*/
function get41($n,$l)
{
global $r;
if ($l == 1) {
/**
* 构造php语句,并eval执行表达式,如果返回给定值,则打印表达式并退出
*/
$result = 'return ' . $n[0] . ';';
if (abs(eval($result)) == $r) {
$m = 1;
echo $n[0]."=".$r; exit;
}
}
for ($i= 0; $i< $l; $i++) {
for ($j= $i+1; $j< $l; $j++) {
/**
* 获取当前要进行四则运算的两个数
* $n[$i]和它的下一个数$n[$j]
*/
$nl = $n[$i];
$nr = $n[$j];
/**
* 将当前数与其下一个数的四则运算表达式push入$n数组的第$i个元素内
* 将$n数组的最后一个元素push入$n数组的第$i+1($j)个元素内
* 并将$l的值-1(由于最后一个元素已经push入前面的元素中,所以有意义的元素个数要-1)
* 然后递归调用get41
*/
$n[$i] = '('.$nl.'+'.$nr.')';
$n[$j] = $n[$l-1];
get41($n,$l-1);
$n[$i] = '('.$nl.'-'.$nr.')';
$n[$j] = $n[$l-1];
get41($n,$l-1);
$n[$i] = '('.$nr.'-'.$nl.')';
$n[$j] = $n[$l-1];
get41($n,$l-1);
$n[$i] = '('.$nl.'*'.$nr.')';
$n[$j] = $n[$l-1];
get41($n,$l-1);
if ($nr != 0) {
$n[$i] = '('.$nl.'/'.$nr.')';
$n[$j] = $n[$l-1];
get41($n,$l-1);
}
if ($nl != 0) {
$n[$i] = '('.$nr.'/'.$nl.')';
$n[$j] = $n[$l-1];
get41($n,$l-1);
}
/**
* 如果下一层递归返回false,代表未找到表达式
* 则还原$n数组,$n[$i] = $nl; $n[$j] = $nr;
* 并进入下一次的for+$j循环体
*/
$n[$i] = $nl;
$n[$j] = $nr;
}
}
return false;
}
参考链接:
4个数字求值:http://www.laruence.com/stashes/compute.php
代码24.php:https://github.com/laruence/laruence.github.com/tree/master/php-gtk-example