1. 递归的返回值问题
1.1 递归
我已知的有两种需求。
-
递归到底,到达某一种情况,然后结束,返回这种情况下的某一个变量。
-
每次递归结束都需要返回一个值,然后利用这个值进行其他操作。
两种区别:
-
第一种注重结果,只关注进行的当前递归即可。
-
第二种关注整体,每一次递归都需要监控。
所以说第二种更占用栈,即更容易发生栈溢出。
然后说下我的经历。
我踩这个坑是在练习扫雷时。需求功能如下:
当点击一格,这一个不是雷时,就以这个格为中心然后向四周扩散,打开相邻的所有空格。实现如下:
- 首先点一格判断是否为雷,不是雷,则打开这格。
- 固定四种移动方向的顺序。
- 判断一种方向上移动是否越界、是否踩雷。
- 进入第一种方向上的递归。即重新开辟一个他本身这样的函数(1,2,3……)。
- 第二种方向的递归。
- 第三种方向的递归。
- 第四种方向的递归。
- 结束。
就我的需求来看是需要第二种递归操作的。但是刚开始写,就没有注意这些。然后点完之后,老是直惯到底。
我在函数内定义一个计数变量,每种方向递归位置并排的位置都将计数变量加一,但每次函数结束的输出都是 1 。
最后才发现我的问题出在递归的产生上。
如果函数名为 loopGo()
上边两种情况,如果是第一种的话,
可以直接
loopGo(ep){ if(...) { return loopGo(ep) } else{ ... } }
而第二种情况的话,就应该这么写。
function loopGo(ep){ if(...) { loopGo(ep) } else{ ... } }
1.2 问题产生
产生区别的地方在于一个是
return
产生递归,一个是调用函数产生递归。 如果是return的话,会把return后的部分作为函数的结果,然后原函数第一层就没了。如果是调用的话就想运行其他代码。这层函数还是在的。所以我就懵逼了一天,找不到问题。
-
2. js 类比较
不能用== 或者===。
- 使用JSON.stringfy() 将类转换为字符串进行比较。
- 。。。待补充