傻瓜式理解遞迴之php遞迴

2022-01-19 20:13:16 字數 1477 閱讀 8097

寫程式這麼久了,有時候別人會問道一些演算法比如排序啊,遞迴啊,總是不知道該怎麼去說,今天就來整理一下,讓更多的人去傻瓜式的理解遞迴。遞迴在網路上有很多定義,但有這麼一句話聽的最多:遞迴就是自己呼叫自己!引用百科的乙個故事去理解:

從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?「從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?『從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?……』」

這樣的故事是不是在做很多重複的事情,像這樣的情況下就可以使用遞迴,遞迴需要幾個條件:

1,遞迴必須 要有邊界條件,也就是遞迴出口(退出遞迴)

2,遞迴前進段和遞迴返回段,也就是最後得到的值

3,當邊界條件(遞迴出口)不滿足時,遞迴前進;當邊界條件(遞迴出口)滿足時,遞迴返回。

舉個遞迴小例子,比如,

張三去和李四借錢,李四說你等一下,我去找王五借給你,

然後李四去找王五借錢,王五說你等一下,我去找趙六借給你,

最後王五找趙六借錢,趙六借給了王五。(這裡就是遞迴出口)

這裡有乙個規律就是最先執行的最後返回,比如張三去借錢,最後才會把錢給他。

傻瓜式理解遞迴,就是忘記遞迴,假設它的子問題已經解決,從上面的例子說就是假設李四已經有錢。

下面說乙個場景,斐波納契數列:1,      1,      2,      3,      5,      8,      13,  21,

34,   55,   89,   144

已知前兩項的和,求第三項的和,因為重複用到這個方法,所以用到遞迴去解:

斐波那契數列的規律是當前項等於前兩項的和,得到的公式是f(n)=f(n-1)+f(n-2);這裡的n表示第幾項,上遞迴**:

這裡假設子問題已經解決,加入求第10項的值公式為:f(10)=f(9)+f(8)故而出現上面的公式

function f($n)

return f($n-1)+f($n-2); // 假設子問題已經解決

}

用迭代的方法求斐波那契數列:

function f($n)

return $v;

}

大家常遇到的面試問題:乙個猴子看一堆桃子,每天,吃了一半,又多吃乙個!當到第十天時,只有乙個桃子了。問題,有幾個桃子?

第十天,只有乙個桃子,第九天就是(1+1)*2個桃子,假設子問題已經解決,f(1)=(f(2)+1)*2,第一天的桃子等於第二天桃子加1乘以2,上**:

/**

* 遞迴實現方法

*/function f($n=1)

return (f($n+1)+1)*2;

}

/**

* 用迭代的方法

*/function f($n)

return $v;

}echo f(1);

隨後會加一些遞迴的例子,待續,如果寫的有什麼不清楚的地方,請批判我

nginx 安裝 php (傻瓜式安裝)

續 nginx 安裝後 安裝 php 1 安裝依賴 yum install gcc bison bison devel zlib devel libmcrypt devel mcrypt mhash devel openssl devel libxml2 devel libcurl devel bz...

機器學習「傻瓜式」理解(11)模型泛化

上一節我們了解到,我們在機器學習領域要解決的主要問題便是高方差的問題,主要的解決的辦法便是模型泛化,其功能的概括來說便是通過限制超引數的大小,來解決過擬合或者模型含有巨大的方差誤差這樣的問題。嶺回歸也是模型正則化一種方式,通過加入模型正則化的方式來更好的解決模型過擬合的線性的產生。根數數學的常識,我...

機器學習「傻瓜式」理解(15)SVM(2)

實際的生產活動中我們遇到的資料大多數不能進行嚴格的區分的,為了解決這種問題,目前為止我們可以通過兩種方式來解決 直接利用多項式項進行解決。利用核心函式 scikit已經封裝好的 下面我們將通過 的方式進行驗證。1.新增多項式項 import numpy as np import matplotlib...