PHP中递归函数的一个常见逻辑问题
首先。我们得知道递归函数是什么东西。通俗来讲也就是自己调用自己本身的函数。
如今须要设计一段代码。解决1到10叠加的问题。
代码A:
<?php
//递归函数
$num=10;
function add($sum){
static $tot;
if($sum>=1){
$tot+=$sum;
add(--$sum);
}else{
return $tot;
}
}
echo add($num);
? >
代码B:
<?php
//递归函数
$num=10;
function add($sum){
static $tot;
if($sum>=1){
$tot+=$sum;
return add(--$sum);
}else{
return $tot;
}
}
echo add($num);
?>
A中打印不出想要的结果,B中能够实现。
而A和B代码中的唯一区别就是在if中加入了一个return。
以下就開始分析整个递归的过程,全然能够去看看盗梦空间加深理解了:(以不能实现的A代码为例)
1.将10带入函数中,if语句推断之后。$tot開始叠加。
2.这里重点来了:将參数减一之后又一次带入函数中。
(没有返回值!!!)
3.接着上面的过程一直循环。一直到$sum=1,这从外到内,由10到1。这10层的循环都没有返回值。
4.$sum=0的时候,要求有返回值。
就好像,盗梦空间中,主角在11层梦境中醒来,可是前面10层的梦境都处于睡眠阶段。这主角你认为醒的过来吗,明显不可能。他仅仅能卡在第11层梦境。永远醒只是来。
唯一能让主角醒过来的办法也就是他的每一层梦醒都醒过来,一直回到现实生活中。而相对与A代码。B代码则从第一层開始就要求有返回值,一直到11层都要有返回值。
所以11层醒过来之后激活了第10层,然后一层一层的激活,最后就顺利醒过来了,这个最后的结果也就正确输出了。
怪不得他们说盗梦空间用递归函数非常好解释。想来确实有点。
剩下的就是自己再深入理解了,一上来确实会有点晕。
PHP中递归函数的一个常见逻辑问题的更多相关文章
- Web安全测试中常见逻辑漏洞解析(实战篇)
Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改 ...
- 弄清SDI显示工程中的每一个信号,每一个逻辑
弄清SDI显示工程中的每一个信号,每一个逻辑 1. FIFO外部逻辑控制 FIFO的读和写在不同的时钟域,所以读和写的控制逻辑应当分开写在不同的两个always块语句中. 2.播出端复位信号的产生 : ...
- FFT中的一个常见小问题(递推式)
FFT中的一个常见小问题这里不细说FFT的内容,详细内容看这些就足以了解大概了小学生都能看懂的FFT!!!FFT详解补充——FFT中的二进制翻转问题主要是对学习过程中一个容易困扰的小问题进行解释,以便 ...
- shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。
shell脚本?在说什么是shell脚本之前,先说说什么是shell. shell是外壳的意思,就是操作系统的外壳.我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包 ...
- 【转】 C#中Finally的一个不太常见的用法
原文地址:http://www.cnblogs.com/listhome/p/3664300.html 最近在看.net BCL 传送门 的源码. 在 System.Collections.Concu ...
- C#中Finally的一个不太常见的用法
最近在看.net BCL 传送门 的源码. 在 System.Collections.Concurrent.ConcurrentQueue 中看到一段有意思的代码.注意这段代码是写在Concurren ...
- PHP编程中10个最常见的错误
PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.本篇经将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助. 错误1:foreach循环后留下 ...
- Go开发中的十大常见陷阱[译]
原文: The Top 10 Most Common Mistakes I've Seen in Go Projects 作者: Teiva Harsanyi 译者: Simon Ma 我在Go开发中 ...
- MySQL中的SQL的常见优化策略
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...
随机推荐
- C#实现邮件发送功能
发送邮件所用的核心知识点 微软封装好的MailMessage类:主要处理发送邮件的内容(如:收发人地址.标题.主体.图片等等) 微软封装好的SmtpClient类:主要处理用smtp方式发送此邮件的配 ...
- 一些User-Agent
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", "Mozilla/4.0 (compatible; MSIE ...
- urllib2.URLError: <urlopen error [Errno 104] Connection reset by peer>
http://www.dianping.com/shop/8010173 File "综合商场1.py", line 152, in <module> httpC ...
- Cookie、Session
Cookie.Session Cookie 保存在浏览器端. 4kb 只能保存字符串,还不能是中文. 获取:Request.getCookies(); 设置时间:setMaxAge(); 小于零是浏览 ...
- java中的上传下载----ajaxFileUpload+struts2
文件上传在项目中应该是非常常见的,而且很多时候,上传文件都只是一个小页面中的一个功能,要求在实现文件上传的前提下不刷新页面.而一般情况下将客户端的文件包装成网络地址传递到服务器端然后通过流来进行文件传 ...
- ArcMap制图_显示指定区域地图内容
摘要:有一张完整的中国地图,有时仅要求针对某一特定区域制图,那么如何在不进行裁剪的情况下仅显示该区域范围的要素内容? 步骤: 1.打开ArcMap,加载完整的中国地图: 2.将要显示的区域范围制作成一 ...
- 关于bootstrap弹出二级对话框的使用
弹出二级对话框,即在对话框的基础上再弹出一个对话框.这对于CRM管理类系统来说应用场景很常见.看到网上有关于实现二级弹出框的方法,需要在一级对话框页面上添加不少css样式.其实,完全可以不用这么麻烦. ...
- OOX 面向对象X
OOA - Object-Oriented Analysis(面向对象分析) OOT - Object-Oriented Testing (面向对象测试) OOP - Object-Oriented ...
- Oracle操作数据库oracleHelper
1 Oracle OracleHelper //============================================================================ ...
- $.ajax传递字符串到后台,后台返回json对象
var mall = { MallID: $("#createId").val().trim(), MallName: $("#createName").val ...