php数字游戏 计算24算法

 更新时间:2012年06月10日 18:39:46   作者:   我要评论
输入任意4个数字,然后对其进行+-*/组合,所得数学表达式值等于24
算法思路:把每一个数字看做一个独立的数学表达式,表达式之间加上标点符号组合成新表达式,一共组合4次,表达式之间的所有组合可以通过递归来实现.
代码如下:
复制代码 代码如下:

<?php
/**
* A 24 maker
* @version 1.0.0
* @author laruence<laruence at yahoo.com.cn>
* @copyright (c) 2009 http://www.laruence.com
*/
class TwentyFourCal {
public $needle = 24;
public $precision = '1e-6';
function TwentyFourCal() {
}
private function notice($mesg) {
var_dump($mesg);
}
/**
* 取得用户输入方法
*/
public function calculate($operants = array()) {
try {
$this->search($operants, 4);
} catch (Exception $e) {
$this->notice($e->getMessage());
return;
}
$this->notice('can\'t compute!');
return;
}
/**
* 求24点算法PHP实现
*/
private function search($expressions, $level) {
if ($level == 1) {
$result = 'return ' . $expressions[0] . ';';
if ( abs(eval($result) - $this->needle) <= $this->precision) {
throw new Exception($expressions[0]);
}
}
for ($i=0;$i<$level;$i++) {
for ($j=$i+1;$j<$level;$j++) {
$expLeft = $expressions[$i];
$expRight = $expressions[$j];
$expressions[$j] = $expressions[$level - 1];
$expressions[$i] = '(' . $expLeft . ' + ' . $expRight . ')';
$this->search($expressions, $level - 1);
$expressions[$i] = '(' . $expLeft . ' * ' . $expRight . ')';
$this->search($expressions, $level - 1);
$expressions[$i] = '(' . $expLeft . ' - ' . $expRight . ')';
$this->search($expressions, $level - 1);
$expressions[$i] = '(' . $expRight . ' - ' . $expLeft . ')';
$this->search($expressions, $level - 1);
if ($expLeft != 0) {
$expressions[$i] = '(' . $expRight . ' / ' . $expLeft . ')';
$this->search($expressions, $level - 1);
}
if ($expRight != 0) {
$expressions[$i] = '(' . $expLeft . ' / ' . $expRight . ')';
$this->search($expressions, $level - 1);
}
$expressions[$i] = $expLeft;
$expressions[$j] = $expRight;
}
}
return false;
}
function __destruct() {
}
}
/* demo */
$tf = new TwentyFourCal();
$tf->calculate( array(4,8,8,8) );
?>

相关文章

  • YII Framework教程之异常处理详解

    YII Framework教程之异常处理详解

    这篇文章主要介绍了YII Framework教程之异常处理,结合实例形式详细分析了Yii框架异常处理机制的原理,使用方法与相关注意事项,需要的朋友可以参考下
    2016-03-03
  • PHP代码判断设备是手机还是平板电脑(两种方法)

    PHP代码判断设备是手机还是平板电脑(两种方法)

    随着互联网移动设备的普及,很多网站都兼容手机端浏览,为了更好的让网页在手机端显示,我们都选择了使用CSS媒体查询制作响应式模版。本文给大家介绍PHP代码判断设备是手机还是平板电脑(两种方法),感兴趣的朋友一起学习吧
    2015-10-10
  • Laravel5.5以下版本中如何自定义日志行为详解

    Laravel5.5以下版本中如何自定义日志行为详解

    这篇文章主要给大家介绍了关于Laravel5.5以下版本中如何自定义日志行为的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • php实现微信企业转账功能

    php实现微信企业转账功能

    这篇文章主要为大家详细介绍了php实现微信企业转账功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • PHP 只允许指定IP访问(允许*号通配符过滤IP)

    PHP 只允许指定IP访问(允许*号通配符过滤IP)

    今天有朋友问我如何只允许指定IP访问,默认禁止其它ip访问,脚本之家小编以前分享的是如何限制指定ip访问,这里正好分享下,需要的朋友可以参考下
    2014-07-07
  • 从零开始学YII2框架(五)快速生成代码工具 Gii 的使用

    从零开始学YII2框架(五)快速生成代码工具 Gii 的使用

    用过Yii1框架的Coder都知道,Gii可以为你快速生成代码,也就是说搭建一个可以增删改查的WebApp可能一行代码都不用写。上次介绍了如何安装Yii框架,本次介绍一下如何使用gii工具快速实现CRUD功能。
    2014-08-08
  • PHP使用CURL_MULTI实现多线程采集的例子

    PHP使用CURL_MULTI实现多线程采集的例子

    这篇文章主要介绍了PHP使用CURL_MULTI实现多线程采集的例子,CURL_MULTI可以对HTTP进行并发访问,需要的朋友可以参考下
    2014-07-07
  • Laravel框架实现发送短信验证功能代码

    Laravel框架实现发送短信验证功能代码

    这篇文章主要介绍了Laravel框架实现发送短信验证的相关资料,非常错具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 微信自定义菜单的处理开发示例

    微信自定义菜单的处理开发示例

    在微信5.0以前,自定义菜单是作为一种内测资格使用的,只有少数公众帐号拥有菜单,因此出现很多企业为了弄到菜单不惜重金求购。现如今,一大批帐号从订阅号转为服务号,很多都是奔着自定义菜单去的。今天我们就来简单研究下微信自定义菜单的处理。
    2015-04-04
  • laravel ORM 只开启created_at的几种方法总结

    laravel ORM 只开启created_at的几种方法总结

    下面小编就为大家分享一篇laravel ORM 只开启created_at的几种方法总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01

最新评论