記錄全部算法相關知識。算法均已驗證,能夠直接運行。
若有錯誤,謝謝指出。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]; }