笛卡尔积与斐波那契数列-PHP
php - @amazeUI - 2017-01-20 01:58:13
先来说说什么叫斐波那契数列,再谈谈如何实现它。1,1,2,3,5.....,从第三个数开始,后面一个数字等于前两个数字之和,就是的了,越到后面越接近0.618,所以又称之为黄金分割数列。前几年有人炒作说啥某某超牛逼的大学生利用这玩意炒股,赚了多少多少钱,纯属骗钱的把戏,也有人张口闭口斐波那契数列,不懂的人哇塞好666啊,其实就很简单,小学生就能做出来,所以这玩意用php实现起来单纯只是为了玩,并且表示这些听起来越厉害的东西,只要愿意去理解他,不管互联网上给你灌溉多少名词和概念,其实经过多方求证和自己动手后,也就那么回事,换汤不换药。
public function fibonacci()
{
$a = 1476;
$b = array(1, 1);
for ($e = 1; $e < $a; $e++) {
$b[$e + 1] = $b[$e] + $b[$e - 1];
}
return $b;
}
上面就是斐波那契数列的php实现,没什么好说的。
下面写一个笛卡尔乘积的php实现。这个得说道说道,我算是翻阅了一些人的php实现,什么递归啊什么什么鬼的,这都啥玩意啊,让人没有看下去的欲望在此表示目前能在互联网上搜到的最好的php实现的笛卡尔乘积就在下方,写了一个类,做了验证。
class Descartes
{
public $res = array();//返回结果
public function index(array $arr)//入口
{
$arr = self::valiarray($arr);
$countarr = count($arr);
if ($countarr <=1) {
$this->res = '传入参数有误';
}else {
self::all($arr);
}
return $this->res;
}
private function all($arr)
{
$result = array();
$count = count($arr);
for ($i = 0; $i < $count - 1; $i++) {
if ($i == 0) {
$result = $arr[$i];
}
$tmp = array();
foreach ($result as $res) {
foreach ($arr[$i + 1] as $set) {
$tmp[] = $res . $set;
}
}
$result = $tmp;
}
$this->res = $result;
}
private function valiarray($arr)//检测传入数据是否合法
{
$arr = array_values($arr);
foreach ($arr as $k => $v) {
if (empty($arr[$k]) || !is_array($arr[$k])) {
unset($arr[$k]);
continue;
}
$v = array_values($v);
foreach ($v as $vk => $c) {
if (is_bool($c)) {
$arr[$k][$vk] = $c === false ? 'false' : 'true';
continue;
}
if (is_null($c)) {
$arr[$k][$vk] = 'null';
continue;
}
if (is_array($c)) {
$arr[$k][$vk] = 'array';
continue;
}
if (is_object($c)) {
$arr[$k][$vk] = 'object';
continue;
}
if ($c == '') {
unset($arr[$k][$vk]);
continue;
}
$arr[$k][$vk] = str_replace(' ', '', $c);
}
}
return $arr;
}
}
这个写法是最简单的。