怎么透彻理解编程里的嵌套?

想请教大家一个问题:

  • 在循环里面, 单个循环好理解.
  • 一个循环里嵌套另一个循环, 测试输出结果, 能理解.
  • 一个循环里嵌套两个循环, 一共三层循环, 就蒙了.
  • 对于多层循环嵌套, 怎么才能达到: 一看代码, 就知道不同层级的变量是什么内容?

  1. 这里面有什么"思维技巧, 某个相关的概念" 能让人理解多层循环嵌套吗? 或者某种思维训练?
  2. 还是说相关代码写的多了就自然理解了?
  3. 对于循环和嵌套, 大家有什么独特的见解吗?

一直发现存在一个问题: php框架, 类库, 环境配置, php函数, 这些都相对容易理解. 反而对于一些基础东西不懂或懂得浅. 比如匿名函数, 闭包, 嵌套循环等等, 很慌.

阅读 326
评论 更新于 2019-08-15
    5 个回答
    _____
    • 244

    把你觉得复杂的东西放到一个方法里面,如果还是觉得复杂,再提取,知道觉得不复杂为止。

    代码重构的精髓所在。

    评论 赞赏 2019-08-15
      1. 我感觉只要选择的算法容易理解,那么代码也相对容易理解一些
      2. 如果再加上一些代码规范层面的就更好了。比如直观的变量名之类的
      3. 很简单的代码,都有人能给你写得晦涩难懂。相信我,这是我好几年代码review的经验。有些人的脑回路就是跟一般人不一样(这些人里有极少数是天才,但大部分都是蠢才)
      4. 至于你说的多层嵌套问题,也是一样的。先尝试理解他的算法,从他要解决的是什么问题,怎么解决的,这两个问题入手。理解了算法,剩下的应该就简单了
      评论 赞赏 2019-08-15

        原则上一般不写超过3层循环的代码。o(n^3)是极限了。
        写了那么久代码,也没遇到过需要3层以上循环的需求(通常就1层、2层比较多吧),如果有,那代码一定有优化空间。

        评论 赞赏 2019-08-15

          像二维数组这样的,一般就会嵌套两个for循环去遍历。
          至于博主所说的闭包,匿名函数等,像在js中是为了避免全局变量同名冲突的问题,
          比如同一个页面引入了1.js,2.js,
          1.js中有

          var a = 1
          setTimeout(function () {
              console.log(a)
          }, 1000)

          2.js中有

          var a = 2
          setTimeout(function () {
              console.log(a)
          }, 1000)

          那么在html页面先后引入的1.js和2.js,那么1.js和2.js中console.log打印的结果都只会是2

          clipboard.png

          因为2.js的a把1.js的a变量重新赋值为2,setTimeout是一个耗时操作,它不会被交给主线程去执行,而是放到异步队列中去了,所以html在加载1.js时,不会等1.js打印完成之后才去加载2.js,所以造成了1.js和2.js都打印的是2。
          如果是团队开发中,很容易出现这种情况,开发人员1写1.js,开发人员2写2.js。
          那么如何避免变量冲突的问题呢?

          js采用了闭包来解决这个问题,这个也叫立即执行函数,写法有很多种,我只列举其中一种
          重新定义1.js和2.js
          1.js

          (function () {
              var a = 1
              setTimeout(function () {
                  console.log(a)
              }, 1000)
          })()    // 先定义一个匿名函数,然后在末尾加上()来执行这个匿名函数。和平时调用函数方法一样,如a() ...

          2.js

          (function () {
              var a = 2
              setTimeout(function () {
                  console.log(a)
              }, 1000)
          })()

          这样打印的结果就是正常了。

          clipboard.png

          如果想要在1.js或2.js暴露变量给其它js文件或者html页面使用,可以将window对象传入,比如

          (function (win) {
              var a = 1
              win.b = '我是window下的一个全局变量'
              setTimeout(function () {
                  console.log(a)
              }, 1000)
          })(window)

          这就是闭包的用法。

          评论 赞赏 2019-08-15

            哈哈,递归是最深的嵌套;

            怎么理解递归,就怎么理解嵌套

            评论 赞赏 2019-08-15
              撰写回答

              登录后参与交流、获取后续更新提醒