PHP 递归经典算法实例

排列算法

首先明确函数的输入和输出,输入是一个字符串还有排列的个数,输出用数组来表示,所以函数的雏形应该是这样的

function permutation($str, $len)
{$res = [];if ($len == 1) {$res = str_split($str);} else {//todo }return $res;
}

接着进行第二步,假设我们已经知道了len-1的输出,要由这个输出得出len的输出。在这个问题里,如果我已经知道了“abcd”选取2个的输出的集合,现在要“abcd”的选取3个集合,要怎样得出呢?

不难发现“abcd”选取1个的结果(a,b,c,d),与“abcd”选取2个的结果(ab,ac,ad,ba,bc,bd,…)的关系,在(a,b,c,d)后面循环插入单个元素与“abcd”的差集。于是得到如下算法。

function permutation($str, $len)
{$res = [];if ($len == 1) {$res = str_split($str);} else {$list = permutation($str, $len - 1);foreach ($list as $vo) {$_arr = array_diff(str_split($str), str_split($vo));foreach ($_arr as $item) {$res[] = $vo . $item;}}}return $res;
}//测试结果
echo PHP_EOL . '<==排列==>' . PHP_EOL;
$res = permutation('abcd', 2);
print_r($res);

组合算法

组合与排列类似,在插入元素时索引必须大于原来集合的任意一个元素的索引

function combination($str, $len)
{$res = [];if ($len == 1) {$res = str_split($str);} else {$list = combination($str, $len - 1);foreach ($list as $vo) {$_arr = array_diff(str_split($str), str_split($vo));$index1 = strpos($str, substr($vo, -1, 1));foreach ($_arr as $item) {$index2 = strpos($str, $item);//在插入元素$item时索引必须大于原来集合的任意一个元素的索引if ($index2 > $index1) $res[] = $vo . $item;}}}return $res;
}echo PHP_EOL . '<==组合==>' . PHP_EOL;
$res = combination('abcd', 2);
print_r($res);
function combination($arr,&$res ,$len,$temp_arr=array())
{$arr_len = count($arr);if ($len == 0) {$res[] = $temp_arr;} else {for ($i = 0; $i < $arr_len - $len + 1; $i++) {$tmp = array_shift($arr);$temp_arr[] = $tmp;combination($arr,  $res,$len - 1, $temp_arr);array_pop($temp_arr);}}
}
echo PHP_EOL . '<==组合算法2==>' . PHP_EOL;
combination(['a','b','c'],$re,2);
print_r([$re]);

最大公约数

/** 更相减损术 求取最大公约数*/
function get_GCD($a, $b)
{if (is_int($a) && is_int($b) && $a > 0 && $b > 0) {if ($a == $b) {return $a;} else if ($a < $b) {return get_GCD($a, $b - $a);} else {return get_GCD($b, $a - $b);}}return NULL;
}
$res = get_GCD(98, 28);
var_dump($res);
/*** 欧几里得算法 求解最大公约数* @param $a* @param $b* @return null*/
function get_GCD_NUM($a, $b)
{if (is_int($a) && is_int($b) && $a > 0 && $b >= 0) {if ($b == 0) {return $a;} else if ($a > $b) {return get_GCD_NUM($b, $a % $b);} else if ($a <= $b) {return get_GCD_NUM($a, $b % $a);}}return NULL;
}
$a = get_GCD_NUM(98, 28);
var_dump($a);

无限极分类

function toTree($arr, $pid, $deep = 0)
{$tree = [];foreach ($arr as $vo) {if ($vo['pid'] == $pid) {$temp_str = str_repeat(' ', $deep);echo $temp_str . ($deep > 0 ? '└─' : '') . $vo['id'] . PHP_EOL;$temp = toTree($arr, $vo['id'], $deep + 1);if (count($temp) > 0) $vo['children'] = $temp;$tree[$vo['id']] = $vo;}}return $tree;
}function toTreeStr($arr, $pid, $deep = 0)
{$str = "";foreach ($arr as $vo) {if ($vo['pid'] == $pid) {$temp_str = str_repeat(' ', $deep);$tmp = $temp_str . ($deep > 0 ? '└─' : '') . $vo['id'] . PHP_EOL;$str .= $tmp;$temp = toTreeStr($arr, $vo['id'], $deep + 1);if ($temp) {$str .= $temp;}}}return $str;
}$arr = [['id' => 1, 'pid' => 0],['id' => 9, 'pid' => 2],['id' => 2, 'pid' => 1],['id' => 3, 'pid' => 0],['id' => 4, 'pid' => 2],['id' => 5, 'pid' => 0],['id' => 6, 'pid' => 4],['id' => 7, 'pid' => 5],['id' => 8, 'pid' => 2],['id' => 10, 'pid' => 9]
];
$tree = toTree($arr, 0);
var_dump($tree);
$tree = toTreeStr($arr, 0);
var_dump($tree);

正整数划分问题

/*** 整数划分问题* @param $n 整数值* @param $m 最大加数*/
function splitNum($n,$m){if($n<=0||$m<=0||!is_int($sn)||!is_int($sn)) return 0;if($n==1||$m==1) return 1;else if($n===$m) return  splitNum($n,$n-1)+1;else if($n<$m) return  splitNum($n,$n);else return  splitNum($n-$m,$m)+splitNum($n,$m-1);
}echo splitNum(9,5);

二叉树

class TreeNode
{/*** @var mixed*/private $value;/*** @var TreeNode*/private $left;/*** @var TreeNode*/private $right;public function __construct($value){$this->value = $value;return $this;}/*** @return mixed*/public function getValue(){return $this->value;}/*** @param mixed $value* @return TreeNode*/public function setValue($value){$this->value = $value;return $this;}/*** @return TreeNode*/public function getLeft(){return $this->left;}/*** @param TreeNode $left* @return TreeNode*/public function setLeft(TreeNode $left){$this->left = $left;return $this;}/*** @return TreeNode*/public function getRight(){return $this->right;}/*** @param TreeNode $right* @return TreeNode*/public function setRight(TreeNode $right){$this->right = $right;return $this;}}class Tree
{/*** @param $root TreeNode* @param int $deep*/public function echoEachNode(TreeNode $root, $deep = 0){if ($root != null) {$temp_str = str_repeat(' ', $deep);echo $temp_str . ($deep > 0 ? '└─' : '') . $root->getValue() . PHP_EOL;$_deep = $deep + 1;if ($root->getLeft() != null) {$this->echoEachNode($root->getLeft(), $_deep);}if ($root->getRight() != null) {$this->echoEachNode($root->getRight(), $_deep);}}}
}//测试
$a = new TreeNode('A');
$b = new TreeNode("B");
$c = new TreeNode("C");
$d = new TreeNode("D");
$e = new TreeNode("E");
$f = new TreeNode("F");
$a->setLeft($b)->setRight($c);
$b->setRight($c);
$c->setLeft($f);$bst = new Tree();
$bst->echoEachNode($a);

PHP递归经典算法实例相关推荐

  1. python实现汉诺塔递归经典算法_Python递归实现汉诺塔算法示例

    本文实例讲述了Python递归实现汉诺塔算法.分享给大家供大家参考,具体如下: 最近面试题,面试官让我5分钟实现汉诺塔算法(已然忘记汉诺塔是啥). 痛定思痛,回来查了一下汉诺塔的题目和算法.题干与实现 ...

  2. Javascript迭代、递推、穷举、递归常用算法实例讲解

    来源 | https://www.jb51.net/article/155800.htm 累加和累积 累加:将一系列的数据加到一个变量里面.最后的得到累加的结果 比如:将1到100的数求累加和 小球从 ...

  3. 遗传算法经典实例代码_经典算法研究系列 之 深入浅出遗传算法

    关注数学,关注AI,关注我们公众号ID:Math-AI 经典算法研究系列 遗传算法 1 初探遗传算法 Ok,先看维基百科对遗传算法所给的解释: 遗传算法是计算数学中用于解决最优化的搜索算法,是进化算法 ...

  4. 【经典算法实现 44】理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法)

    [经典算法实现 44]理解二维FFT快速傅里叶变换 及 IFFT快速傅里叶逆变换(迭代法 和 递归法) 一.二维FFTFFTFFT快速傅里叶变换 公式推导 二.二维FFTFFTFFT 及 IFFTIF ...

  5. Java经典算法四十例编程详解+程序实例

    JAVA经典算法40例 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: ...

  6. 87-Java方法递归形式、算法流程总结、递归常见案例、递归经典案例-猴子吃桃问题、非规律化递归案例-文件搜索、啤酒问题

    方法递归 一.递归的形式和特点 1.什么是方法递归? 方法直接调用自己或者间接调用自己的形式称为方法递归(recursion). 递归作为一种算法在程序设计语言中广泛应用. 2.递归的形式 直接递归: ...

  7. 程序员必须要掌握的十大经典算法

    算法一:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通 ...

  8. 翻手算法php,PHP各种常见经典算法总结【排序、查找、翻转等】

    本文实例讲述了php各种常见经典算法.分享给大家供大家参考,具体如下: 冒泡排序算法 public function test() { $arr = array(43, 54, 62, 21, 66, ...

  9. 数据挖掘十大经典算法(详解)

                                                           数据挖掘十大经典算法  一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法 ...

最新文章

  1. #Ruby# Introspect (2)
  2. EXCHANGE证书
  3. things to do in English debate: scenario
  4. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 分组(矩阵快速幂套NTT优化dp)
  5. python 示例_带有示例的Python date timetuple()方法
  6. web安全----xss工具使用3
  7. matlab fair,matlab练习程序(加权最小二乘)
  8. 浙大 PAT b1039
  9. 责任分配矩阵和raci的区别_有限责任公司实现盈利,当年就一定可以分红吗?...
  10. OFFICE技术讲座:JDK绘制旋转字体的效果(水平)
  11. java-net-php-python-jsp大麦公司网上拍卖商城计算机毕业设计程序
  12. 九型人格,工作中的好帮手.
  13. android 改机型玩王者,安卓手机改机型华为nova 8 Pro体验《王者荣耀》90帧超高帧率模式...
  14. 为什么我的计算机不能更新系统,为什么我的电脑重新安装系统建设银行网银不能......
  15. 智能管家App kotlin版(2)——工具类封装与首页引导页开发
  16. android添加nfc门禁卡,IOS14nfc怎么添加门禁卡?NFC门禁卡教程[多图]
  17. access的否定形式_雅思考试对于新手有多难?
  18. 前缀和——(1)什么是前缀和和一维前缀和
  19. 计算机专业去支教学到什么,支教的收获及感悟4篇_大学生支教感想
  20. C语言 输入一个华氏温度F,要求输出摄氏度C。

热门文章

  1. ASCII码表及回车、换行、空格
  2. mysql实现二分法查找_算法之二分法查找
  3. mysql数据类型介绍(含text,longtext,mediumtext说明)
  4. 汽车管理程序(数据结构课程练习)
  5. OA系统:实现员工签到表导出xls
  6. 网站如何启用https
  7. 【k8s系列,持续更新中】2.1 入门k8s_跑个应用看看 (且随疾风前行,身后一许流星~~)
  8. linux C函数之strdup函数分析
  9. 一个全基因组重测序分析实战
  10. 管理者如何给员工沟通绩效