php算法實現 (二)

記錄全部算法相關知識。算法均已驗證,能夠直接運行。
若有錯誤,謝謝指出。php

1.斐波那契數列兩種實現方式算法

<?php

print_r(fibonacci(50));

function fibonacciRecursive($m)
{
    if ($m <=1) {
        return $m;
    }
    //每次都會再生成兩個新的fibonacci,時間複雜度2^n.不建議用這種。對於$m=100.程序崩潰
    return fibonacciRecursive($m-1) + fibonacciRecursive($m-2);
}

function fibonacci($m)
{
    $fibonacciArray[0] = 0;
    $fibonacciArray[1] = 1;
    for ($i=2;$i<$m;$i++) {
        $fibonacciArray[$i] = $fibonacciArray[$i-1] + $fibonacciArray[$i-2];
    }
    return $fibonacciArray;
}

2.有5我的偷了一堆蘋果,準備在次日分贓。 晚上,有一人遛出來,把全部蘋果分紅5份,可是多了一個,順手把這個扔給樹上的猴了,本身先拿1/5藏了。沒想到其餘四人也都是這麼想的,都如第一我的同樣分紅5份把多的那一個扔給了猴,偷走了1/5。次日,你們分贓,也是分紅5份多一個扔給猴了。最後一人分了一份。問:共有多少蘋果?N 我的呢?數組

<?php
$peopleNo = 5;
echo totalApple($peopleNo);

function totalApple($peopleNo)
{
    for ($i=1; ;$i++) {
        $result = $i;
        for ($m=0;$m<=$peopleNo;$m++) {
            if ($result%$peopleNo == 1) {
                $result = $result - round(($result-1)/$peopleNo) - 1;
            } else {
                continue 2;
            }
        }
        return $i;
    }
}

3.輸出一組數組的全排列。 [1,2,3] 輸出 [1,2,3] [1,3,2] [2,1,3] [2,3,1] [3,1,2] [3,2,1]app

<?php 

$arr = [1,2,3];
print_r(totalOrder($arr, 0, count($arr)-1));

//遞歸實現。index是當前要交換的位置,end是最後的位置
function totalOrder($arr, $index, $end)
{
    //遞歸最重要的是輸出或者結束條件,當index到達最後,說明全部值以交換一遍
    if ($index == $end) {
        print_r($arr);
    }
    for ($i=$index;$i<=$end;$i++) {
        //index位置和i位置交換
        list($arr[$i], $arr[$index]) = array($arr[$index], $arr[$i]);
        totalOrder($arr, $index+1, $end);
        //換回,不影響其餘遞歸的繼續
        list($arr[$i], $arr[$index]) = array($arr[$index], $arr[$i]);
    }
}

4.假設密碼爲六位數字構成,好比‘000231’ ‘345678’。但咱們不知道傳入的密碼值,要求破解輸出密碼。函數

<?php

$password = "555555";
echo hackPassword($password);

function hackPassword($password)
{
    //去掉前面的0,以後才能轉換成整數
    $password = ltrim($password, '0');
    $password = intval($password);
    $left = 0;
    $right = 999999;
    //至關於二分法,可是最後返回不一樣
    while (true) {
        $middle = intval(($left + $right)/2);
        if ($middle > $password) {
            $right = $middle - 1;
        } else if ($middle < $password) {
            $left = $middle + 1;
        } else {
            $hack = $middle;
            break;
        }
    }
    //前邊放0組成六位密碼
    $hack = str_pad($hack, 6, '0', STR_PAD_LEFT);
    return $hack;
}

5.看到過一篇數組一一對應的加密解密算法,又想到array_map這種能夠傳遞callback的函數。因此試着重寫加密解密函數.類似的函數還有array_filter, array_walk.這篇文章對array函數總結的很好
https://code.tutsplus.com/tut...加密

<?php

$arr = 'ezacbdzfcg';

$mappedArr = array_map("decrypt", str_split($arr));
echo implode('', $mappedArr);

function decrypt($c)
{
    //加密解密數組,一一對應
    $encryption = ['a','b','c','d','e','f','g'];
    $decryption = ['l','v','o','e','I','y','u'];
    $index = array_search($c, $encryption);
    //若是存在即輸出,不存在就輸出空格。注意要用===,不然index爲零時也會判斷成false
    if ($index === false) return ' ';
    return $decryption[$index];
}
相關文章
相關標籤/搜索