递归算法 recursion

来源:互联网 发布:淘宝网汉服 编辑:程序博客网 时间:2024/06/05 06:52
1. 汉诺塔
临界点:最大的盘n要从A移到C,需要将n-1,...,1的盘子都移到B上,然后将A上最大的盘n移到C上,再移动n-1个盘子,
由此可知 H(n) = H(n-1) + 1 + H(n-1) = 2H(n-1) + 1; 则 H(n) = 2^n + 1;
// A  B  Cfunction Hanoi($n, $from, $assist, $to) {    if ($n == 1) {        move(1, $from, $to);    } else {        // 先把n-1个盘子从    A --> B        Hanoi($n-1, $from, $to, $assist);        // 把最大的n盘从      A --> C        move($n, $from, $to);        // 把n-1个盘子从      B --> C        Hanoi($n-1, $assist, $from, $to);    }     }function move($n, $from, $to) {    echo "{$n}号盘子从  {$from} --> {$to} <br>";}Hanoi(3, 'A', 'B', 'C');// 求最少移动步数function sum($n) {    if ($n == 1)        return 1;    else        return 2*sum($n-1) + 1;}echo sum(3);// 尾递归实现function ssum($n, $s=1) {    return $n > 1 ? ssum($n-1, 2*$s+1) : $s;}

2. Fibonacci斐波那契数列
     --- 不用递归算法实现
// 使用数组function fibonacci($n) {    $fb = [1, 1];    for ($i=2; $i<$n; $i++) {        $fb[$i] = $fb[$i-1] + $fb[$i-1];    }    return $fb[$n-1];}echo fibonacci(5) // 8

3. 递归法求数组中的最大值
     --- 性能比循环法慢一倍
function maxss($arr, $low, $high) {    if ($low > $high - 2) {        $max = $arr[$low] > $arr[$high] ? $arr[$low] : $arr[$high];    } else {        $mid = ceil( ($low + $high) / 2);        $max1 = maxss($arr, $low, $mid);        $max2 = maxss($arr, $mid+1, $high);        $max = $max1 > $max2 ? $max1 : $max2;    }    return $max;}echo maxss($arr, 0, count($arr)-1);





0 0
原创粉丝点击