递归算法详细分解 例子

//例子
function demo($n){  if($n>1)  {		    $n=$n*demo($n-1);	  }  else  {		    return 1;	  }	  return $n;}

echo demo(10);

解答:

递归其实就是“一个函数的自调用”在这个“自调用”的过程中,必须要有一个变化的“参数”,当这个“参数”达到你的期望值的时候,终止该“自调用”过程
拿楼主的程序来说

demo($n)内部又有调用demo($n-1),构成了“自调用”且,$n又有一个“期望值”,即是$n>1,不满足此条件时,该自调用终止

即是说,最后一个执行的demo是demo($n9-1),其中$n9=2,然后返回为1(因为执行了return 1)则$n9*demo($n9-1)即等于 2*demo(2-1),又等于2*1=2;则$n8*demo($n8-1)即等于 3*demo(3-1),又等于3*2=6;则$n7*demo($n7-1)即等于 4*demo(4-1),又等于4*6=24;……依次类推

这样想:demo(1)是等于1,这个没有疑问吧?然后demo(2)等于2*demo(1)=2*1=2然后demo(3)等于3*demo(2)=3*2=6……一直到demo(10)

追问

这个程序是算的10 的阶乘  return $n  是啥意思? 是返回每一次乘的结果 然后最终都乘在一起?  谢谢

回答

return $n啊……首先你要理解一点,一个函数比如CODE:demo($n){return $n+1;}它的意义就是,demo($n)=$n+1,你获取demo(1)的值就等于获取2你获取demo(2)的值就等于获取3这个你应该理解的,然后我再变化一下:CODE:demo($n){return $n*demo($n+1);}这个就构成递归了但是这个递归没有出口,永远不会结束首先,楼主,请用模拟下程序的思维,你调用了demo(1),程序会怎么做?第一步,程序会进入到函数体中第一步计算  1*demo(2) 对不对?第二步,程序又遇到了第二个函数体,即是demo(2),于是进入到demo(2)中进行2*demo(3)第三步,程序又遇到了第三个函数体,即是demo(3),于是进入到demo(2)中进行2*demo(4)……永无止境

除非 你加一个边界值:CODE:demo($n){if($n>2)    return 1;return $n*demo($n+1);}其实这就是数学方程式:                  n*f(n+1),n<3f(n)={                 1,n>=3这也就是为什么方程式和方法体都叫做函数(function)的原因于是$n=3的时候,程序体终止,回到之前的第三步,得到了demo(3)=1然后回到了之前的第二步,得到了demo(2)=2*demo(3)=2然后回到之前的第一步,得到了demo(1)=1*demo(2)=2

说了这么多,return的意义就在于,让你的demo()函数体具有一个可以被计算的值于是,你的式子也可以列出和上面那个一样的数学函数来了           n*f(n-1);n<=1f(n)={           1,n>1f替换成demo有什么区别么?递归都可以用这种数学表达式列出来,是不是清晰很多?

追问

的确清晰很多  非常感谢  以后有不会的问题 还想请教您 !
提问者评价
的确清晰很多  非常感谢  以后有不会的问题 还想请教您 !

递归算法详细分解 例子

时间: 2024-12-30 10:44:43

递归算法详细分解 例子的相关文章

有关递归算法的小例子

程序调用自身的编程技巧称为递归( recursion).一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.用递归思想写出的程序往往十分简洁易懂.一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. 注意: (1) 递

C++输出全排列递归算法详细解释

中心思想: 设R={r1,r2,-,rn}是要进行排列的n个元素,Ri=R-{ri}. Perm(X)表示在全排列Perm(X)的每一个排列前加上前缀ri得到的排列. (1)当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素: (2)当n>1时,Perm(R)可由(r1)+Perm(R1),(r2)+Perm(R2),-,(rn)+Perm(Rn)构成. 那么具体程序要怎么实现呢?我们来个实际的例子,假设有一数列1,2,3,4 那么1,2,3,4的全排列 perm({1,2,3,4}

递归算法详细分析

C通过运行时堆栈支持递归函数的实现.递归函数就是直接或间接调用自身的函数.     许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的<C语言程序设计>一书中就是从阶乘的计算开始的函数递归.导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归.但是在阶乘的计算里,递归并没有提供任何优越之处.在菲波那契数列中,它的效率更是低的非常恐怖. 这里有一个简单的程序,可用于说明递归.程序的目的是把一个整数从二进制形式转换为可打印的字符形式.例如:给出一个值4267

56张图详细分解Flash CS6中对齐面板的使用

Flash CS6的"对齐面板"用于舞台中对象的对齐.分布.匹配大小.间隔等操作.就是下图这个东东: 它是动画制作过程中用于"排兵布阵"的好帮手.教学中发现学生对"对齐面板"的了解经常是初浅的,只有模模糊糊的一个概念,不能把握其真正的精髓.因此,决定使用比较形象的图来分解这些操作,让学生对把握其精髓,好"排兵布阵".(真是应了一句网络语:不作不死!图解共截了56张图,很辛苦的......) 一.先看操作选项 从上图的"

Wget下载终极用法和15个详细的例子

Wget是一种很好用的因特网下载工具,他具有的很多特性是其他工具所不能比拟的,再者他是一个轻量级可配置的下载工具. 本文结合例子介绍Windows下wget的多种下载方法和用途. 1.用Wget下载单个文件 下载的时候会显示: ~文件的大小.连接状态.连接地址以及文件的大小 ~保存的名称 ~下载进度条 ~下载速度.时间,还有多少未下载 例如我下载editplus时输入 wget http://software-files-a.cnet.com/s/software/12/32/81/47/epp

JavaMail API 详细分解

在使用Spring框架的过程中,它的优势之一就是在于跟其他一些技术的整合,如JavaMail .任务调度.缓存策略等技术.今天就Java Mail详细阐述.JavaMail API是被设计为与协议无关的,但是目前我们并不能克服这些协议的束缚.了解JavaMail之前,需要详细了解几个邮件协议,SMTP POP IMAP MIME,现就这些协议详细分析如下: 1.SMTP协议:简单邮件传输协议定义了递送邮件的机制.这个SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者

插件化知识详细分解及原理 之代理,hook,反射

上一篇我们说了Binder机制,通过aidl的demo和系统源码的对比进行了运行过程的分析,这一篇我们说代理模式及反射,之前说过了,只是为了梳理插件化需要了解的知识点,所以不会特别深的去讲解. 代理模式: 也叫做委托模式,分为静态代理和动态代理.代理模式也是平时比较常用的设计模式之一,代理模式有代码简洁,高扩展性的特性.主要目的就是为访问者提供一个代理,以达到限制某个对象的访问,也就是说想访问一个对象,其实我给你的是一个代理,不让你直接使用我.估计不理解的人会问为什么使用代理模式,他限制了对象的

nginx---------------------------nginx日志详细分解

1.客户端(用户)IP地址.如:上例中的 47.52.45.228 2.访问时间.如:上例中的 [03/Jan/2013:21:17:20 -0600] 3.访问端口.如:上例中的 127.0.0.1:9000 4.响应时间.如:上例中的 0.007 5.请求时间.如:上例中的 0.007 6.用户地理位置代码(国家代码).如:上例中的 MX(墨西哥) 7.请求的url地址(目标url地址)的host.如:上例中的 pythontab.com 8.请求方式(GET或者POST等).如:上例中的

mdadm详细使用手册

1. 文档信息 当前版本 1.2 创建人 朱荣泽 创建时间 2011.01.07 修改历史 版本号 时间 内容 1.0 2011.01.07 创建<mdadm详细使用手册>1.0文档 1.1 2011.01.10 增加”实验”内容 1.2 2012.04.13 删除”实验内容”                   2. mdadm的主要功能 mdadm是一个用于创建.管理.监控RAID设备的工具,它使用Linux中的md驱动. mdadm程序是一个独立的程序,能完成所有软件RAID的管理功能,