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中递归函数的一个常见逻辑问题

时间: 2024-10-10 16:53:18

PHP中递归函数的一个常见逻辑问题的相关文章

Web安全测试中常见逻辑漏洞解析(实战篇)

Web安全测试中常见逻辑漏洞解析(实战篇) 简要: 越权漏洞是比较常见的漏洞类型,越权漏洞可以理解为,一个正常的用户A通常只能够对自己的一些信息进行增删改查,但是由于程序员的一时疏忽,对信息进行增删改查的时候没有进行一个判断,判断所需要操作的信息是否属于对应的用户,导致用户A可以操作其他人的信息.? 逻辑漏洞挖掘一直是安全测试中"经久不衰"的话题.相比SQL注入.XSS漏洞等传统安全漏洞,现在的攻击者更倾向于利用业务逻辑层的应用安全问题,这类问题往往危害巨大,可能造成了企业的资产损失和

FFT中的一个常见小问题

FFT中的一个常见小问题 这里不细说FFT的内容,详细内容看这些就足以了解大概了 小学生都能看懂的FFT!!! FFT详解 补充--FFT中的二进制翻转问题 主要是对学习过程中一个容易困扰的小问题进行解释,以便于理解 用FFT将多项式的系数转换为点值时,原系数数组a最后存的是不同的点值,而不是只有第一个是点值 这一点最开始困扰了我很久 设 $A(x)=a_0+a_1x+a_2x^2+...+a_{n?1}x^{n?1}$ 则可将其移项 $A(x)=(a_0+a_2x^2+...+a_{n?2}x

【转】 C#中Finally的一个不太常见的用法

原文地址:http://www.cnblogs.com/listhome/p/3664300.html 最近在看.net BCL 传送门 的源码. 在 System.Collections.Concurrent.ConcurrentQueue 中看到一段有意思的代码.注意这段代码是写在ConcurrentQueue这个用于并发中的队列. 注意,这是一个无锁队列的实现. try { } finally { newhigh = Interlocked.Increment(refm_high); if

PHP编程中10个最常见的错误

PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.本篇经将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助. 错误1:foreach循环后留下悬挂指针 在foreach循环中,如果我们需要更改迭代的元素或是为了提高效率,运用引用是一个好办法: 1 2 3 4 5 $arr = array(1, 2, 3, 4); foreach ($arr as &$value) {     $value = $value * 2; } // $arr

在roller中如何实现一个blog有多个主题?

背景 当前获取信息的设备越来越多,比如平板电脑.智能手机,已经不是过去PC统治的年代了.所以很多网站为了提高用户体验根据不同的设备用不同的主题展现相同的数据.那么在roller中如何实现一个网站实现不同的主题呢?要考虑哪些因素? 有同学或许会说,这没什么的,用js+css或者借助一些框架就能根据不同的设备实现不同的主题.这是一种常见的方法,但在roller中可能要考虑的因素不同,机制不同. 原理 根据请求的URL不同让blog选择不同的主题.比如我们用域名www.example.com为PC访问

关于一个递归逻辑的代码优化建议

1.需求说明 刚接手一个项目,有个文件上传分类功能,但每次只能操作一个文件,测试需要几十个上百个文件,效率实在太低了. 于是让公司小弟改为可以支持批量上传,小弟在写的时候,发现后端只能一个文件处理结束后,才能接收下一个,在后端不修改的情况下,只能写递归来实现. html代码 <input type="file" name="file" multiple id="file" onchange="angular.element(thi

Go开发中的十大常见陷阱[译]

原文: The Top 10 Most Common Mistakes I've Seen in Go Projects 作者: Teiva Harsanyi 译者: Simon Ma 我在Go开发中遇到的十大常见错误.顺序无关紧要. 未知的枚举值 让我们看一个简单的例子: type Status uint32 const ( StatusOpen Status = iota StatusClosed StatusUnknown ) 在这里,我们使用iota创建了一个枚举,其结果如下: Stat

【转载】串口中怎样接收一个完整数据包的解析

这里以串口作为传输媒介,介绍下怎样来发送接收一个完整的数据包.过程涉及到封包与解包.设计一个良好的包传输机制很有利于数据传输的稳定性以及正确性.串口只是一种传输媒介,这种包机制同时也可以用于SPI,I2C的总线下的数据传输.在单片机通信系统(多机通信以及PC与单片机通信)中,是很常见的问题. 一.根据帧头帧尾或者帧长检测一个数据帧 1.帧头+数据+校验+帧尾 这是一个典型的方案,但是对帧头与帧尾在设计的时候都要注意,也就是说帧头.帧尾不能在所传输的数据域中出现,一旦出现可能就被误判.如果用中断来

在Salesforce中对某一个Object的Standard Button或Link进行重写

在Salesforce中可以对某一个Object的Standard Button或Link进行重写,来实现我们特定的逻辑过程,比如:在删除某个Object之前要判断该Object的某个Field的状态:或者在New一个Object的时候要对一些Field进行预赋值. 1):如下图所示,展现了一个Object中所有的Button,Link和Action,那么用红框框出来的便是Standard的 2):这里我们以New按钮为例进行展示,点击上图中New前方所对应的Edit操作,会出现下面图示,默认状