傻瓜式理解递归之php递归

  写程序这么久了,有时候别人会问道一些算法比如排序啊,递归啊,总是不知道该怎么去说,今天就来整理一下,让更多的人去傻瓜式的理解递归。递归在网络上有很多定义,但有这么一句话听的最多:递归就是自己调用自己!引用百科的一个故事去理解:

从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”

这样的故事是不是在做很多重复的事情,像这样的情况下就可以使用递归,递归需要几个条件:

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)故而出现上面的公式

?
1
2
3
4
5
6
function f( $n</code><code class="php plain">){</code></div><div class="line number2 index1 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">if</code><code class="php plain">(</code><code class="php variable">$n</code><code class="php plain">==1 || </code><code class="php variable">$n</code><code class="php plain">==2){</code></div><div class="line number3 index2 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">return</code> <code class="php plain">1; </code><code class="php comments">// 递归出口,</code></div><div class="line number4 index3 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}</code></div><div class="line number5 index4 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">return</code> <code class="php plain">f(</code><code class="php variable">$n</code><code class="php plain">-1)+f(</code><code class="php variable">$n -2); // 假设子问题已经解决
}

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

?
1
2
3
4
5
6
7
8
9
10
11
function f( $n</code><code class="php plain">){</code></div><div class="line number2 index1 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$a</code> <code class="php plain">= 1;</code></div><div class="line number3 index2 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$b</code> <code class="php plain">= 1;</code></div><div class="line number4 index3 alt1"><code class="php plain">     </code><code class="php variable">$v</code> <code class="php plain">= 1;&lt;br&gt;</code></div><div class="line number5 index4 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">for</code><code class="php plain">(</code><code class="php variable">$i</code><code class="php plain">=3;</code><code class="php variable">$i</code><code class="php plain">&lt;=</code><code class="php variable">$n</code><code class="php plain">;++</code><code class="php variable">$i</code><code class="php plain">){</code></div><div class="line number6 index5 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$v</code> <code class="php plain">= </code><code class="php variable">$a</code><code class="php plain">+</code><code class="php variable">$b</code><code class="php plain">;</code></div><div class="line number7 index6 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$b</code> <code class="php plain">= </code><code class="php variable">$a</code><code class="php plain">;</code></div><div class="line number8 index7 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$a</code> <code class="php plain">= </code><code class="php variable">$v</code><code class="php plain">;</code></div><div class="line number9 index8 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}</code></div><div class="line number10 index9 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">return</code> <code class="php variable">$v ;
}

 大家常遇到的面试问题:一个猴子看一堆桃子,每天,吃了一半,又多吃一个!当到第十天时,只有一个桃子了。问题,有几个桃子?

第十天,只有一个桃子,第九天就是(1+1)*2个桃子,假设子问题已经解决,f(1)=(f(2)+1)*2,第一天的桃子等于第二天桃子加1乘以2,上代码:

 

?
1
2
3
4
5
6
7
8
9
/**
  * 递归实现方法
  */
function f( $n</code><code class="php plain">=1){</code></div><div class="line number5 index4 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">if</code><code class="php plain">(</code><code class="php variable">$n</code><code class="php plain">==10){</code></div><div class="line number6 index5 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">return</code> <code class="php plain">1; </code><code class="php comments">// 递归出口</code></div><div class="line number7 index6 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}</code></div><div class="line number8 index7 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">return</code> <code class="php plain">(f(</code><code class="php variable">$n +1)+1)*2;
}

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
/**
  * 用迭代的方法
  */
function f( $n</code><code class="php plain">){</code></div><div class="line number5 index4 alt2">&nbsp;</div><div class="line number6 index5 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$v</code> <code class="php plain">= 1; </code><code class="php comments">// 设定初始值</code></div><div class="line number7 index6 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">for</code><code class="php plain">(</code><code class="php variable">$i</code><code class="php plain">=9;</code><code class="php variable">$i</code><code class="php plain">&gt;=</code><code class="php variable">$n</code><code class="php plain">;--</code><code class="php variable">$i</code><code class="php plain">){</code></div><div class="line number8 index7 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php variable">$v</code> <code class="php plain">= (</code><code class="php variable">$v</code><code class="php plain">+1)*2;</code></div><div class="line number9 index8 alt2"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php plain">}</code></div><div class="line number10 index9 alt1"><code class="php spaces">&nbsp;&nbsp;&nbsp;&nbsp;</code><code class="php keyword">return</code> <code class="php variable">$v ;
}
echo f(1);

 随后会加一些递归的例子,待续,如果写的有什么不清楚的地方,请批判我

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值