递归思想和递推思想

有关函数的编程思想

递归思想一递归函数

例1   考察一个最简单的函数

function f1($n){

echo  $n;

$n++;

f1($n);

}

f1(1);

分析:此函数调用永无止境,内存消耗完毕,死机。

           实用的递归函数:能够控制这个调用的过程,会在某个时刻停下来。

例2    求5的阶乘

5!=1*2*3*4*5;

分析:数学上,阶乘的基本规则

        n!=n*n-1*.....*1;

         1!=1;

反推法:

假设有一个函数能够计算n的阶乘。

为了解决这个问题,引入适当的符号表示这个函数

function jiecheng($n){

$jieguo=$n*jiecheng($n-1);

return $jieguo;

}

$v1=jiecheng(8);//结果为8的阶乘

$v2=jiecheng(5);//结果为5的阶乘

如果你不能解决所提出的问题,可先解决一个与此有关的问题.你能不能想出一个更容易着手的有关问题?一个更特殊的问题?

当 n=5时

$jieguo=5*jiecheng(4);==》

n=4==>

$jieguo=5*(4*jiecheng(3));==>

n=3;

$jieguo=5*(4*3*(jiecheng(2)));==>

n=2

$jieguo=5*(4*3*(2*jiecheng(1))));

n=1时

function jiecheng($n){

if($n==1){

return 1;

}

$jieguo=$n*jiecheng($n-1);

return $jieguo;

}


$v2=jiecheng(5);//结果为5的阶乘


练习:求8的阶乘

答案:

function jiecheng($n){

echo "<br/>开始:有人求的{$n}的阶乘:1";

if($n==1){

echo "<br/> 结束:终于求的{$n}的阶乘:1";

return 1;

}

$jieguo=$n*jiecheng($n-1);

echo "<br/> 结束:终于求的{$n}的阶乘:$jieguo";

return $jieguo;

}

$v2=jiecheng(8);//结果为8的阶乘


递归思想:

面对一个大问题,该大问题可以经由该问题的同类“小一级”问题而经过简单计算获得。

而且可以获知这类问题的最小一级问题的答案。此时就可以使用递归思想来解决问题。

递归函数的基本模式

function digui($n){

if(是最小一级){

return  已知答案;

}

$jieguo=对digui($n-1)进行简单运算;

return  $jieguo

}

练习: 1,1,2,3,5,8,13,

说明:

  第一项 1

第二项   1

其他项    其前两项的和

求n项

[分析】

反推法

假定一个函数求出结果

function shulie($n){

if($n==1||$n==2){

return 1;


}

$result=shulie($n-2)+shulie($n-1);

return $result;

}

$v1=shulie(20);

结论

反推模式:最终目标:要求最大级问题-----》小一级问题-----》更小级问题------》最小级问题:答案已知

话术递归法     未来猜想--》现在---》过去--》大学--》高中---》初中---》小学---》幼儿园--》出生

递推(迭代)思想

例1  求5的阶乘

[]

代码演示:  

<?php


//1的阶乘

$jiecheng1=1;

$jiecheng2=$jiecheng1*2;

$jiecheng3=$jiecheng2*3;

$jiecheng4=$jiecheng3*4;

$jiecheng5=$jiecheng4*5;

?>

将上述代码优化


<?php

//1的阶乘

$qian=1;//表示前一个已知答案

for($i=2;$i<=5;++$i){

$jieguo=$qian*$i;//要求的结果是前一个结果经过简单乘法运算得到。

echo "<br/>{$i}的阶乘为:$jieguo";

$qian=$jieguo;//将当前求得结果,当成前一个,以供下一次使用

}

echo  "<br/>结果为:".$jieguo;


?>

结论:

如果要求一个大问题,且该问题有如下2个特点:

已知该问题的同类问题的最小问题的答案

如果知道这种问题的小一级问题的答案,就可以轻松求得大一级问题的答案,并且此问题级次有一定规律。

$qian=已知问题最小一级问题的答案

for($i=最小一级的下一级;$i<=最大一级的级次;++$i){

$jieguo=对$qian进行一定的计算,需要使用$i;

$qian=$jieguo;

}

echo "结果:" .$jieguo

推广:上面的例子

<?php

$qian1=1;

$qian2=1;

for($i=3;$i<=20;$I++){

$jieguo=$qian1+$qian2;

$qian1=$qian2;

$qian2=$jieguo;


}

echo "<br/>数列的20项:$jieguo";



?>



递推思想:

最小问题:已知---》大一级  可求----》更大一级---》最大问题。

选择:

即可选择递归又可选择递推,推荐递推。


项目实战的应用

PHP无限分类技术

参阅php中文网《PHP无限级分类之实现原理》

地址:

http://www.php.cn/code/3966.html

什么是PHP无限分类?就像windows下新建一个文件夹,在新建的文件夹下又可以新建一个文件夹,这样无限循环下去,无限分类也是这样,父类可以分出它子类,子类又可以分出它的子类,这样一直无限循环下去,假设有这样的一个三级分类,新闻→PHP新闻→PHP7出来了。如果我们要查找“PHP7出来了”这条新闻,我们先点击新闻,然后再点击PHP新闻就可以查出来了,也就是说我们可以通过祖父类一级一级地往下找,反过来我们只要知道一个子类的父类,就可以把它查找出来了。这样我们在设计数据库时就可以多设计一个父类id的字段就可以实现PHP无限分类的功能了。

无限级分类原理简介

无限分类看似"高大上",实际上原理是非常简单的 。无限分类不仅仅需要代码的巧妙性,也要依托数据库设计的合理性。要满足无限级分类,数据库需要有两个必须的字段,id,pid。id用来标识自身,而pid则是用来表明父级id。也就是说,每个分类记录不仅描述了自身,还描述了与其关心最为紧密的另一个id。看似复杂的事情被这样一个小技巧解决了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容