php 24点算法,求24点表达式的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;

}

参考链接:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值