Js来分析递归
栏目: JavaScript · 发布时间: 6年前
内容简介:相信在数学中很常见这个概念,实际在编程中也很常见这样的思维。递归通俗的来说,就是通过不断的将当前问题进行分解,向前追溯直到终点然后再反推求解的过程。看电影时不清楚自己在第几排,可以通过问前一排的人来得知,进行加1即可。那么用递归的思路求解代码就是这样的。一共有n格,每步可以走1格或者2格,问一共有多少走法。 首先分解问题是第n格可以是前面n-1格走的,也可能是n-2格走的。所以fn(n) = f(n-1) + f(n-2)。也要知道终止条件是只有1步,那么只有一步的可能情况是还有1格,也可能是还有2格。
相信在数学中很常见这个概念,实际在编程中也很常见这样的思维。递归通俗的来说,就是通过不断的将当前问题进行分解,向前追溯直到终点然后再反推求解的过程。
通俗解读
案例一 :看电影不知道在第几排
看电影时不清楚自己在第几排,可以通过问前一排的人来得知,进行加1即可。那么用递归的思路求解代码就是这样的。
function fn = (n) { if(n< = 0) return '座位不存在' if(n>1) { return fn(n-1)+1 } else { return 1 } } 复制代码
案例二 :走格子有多少走法
一共有n格,每步可以走1格或者2格,问一共有多少走法。 首先分解问题是第n格可以是前面n-1格走的,也可能是n-2格走的。所以fn(n) = f(n-1) + f(n-2)。也要知道终止条件是只有1步,那么只有一步的可能情况是还有1格,也可能是还有2格。
function fn = (n){ if(n>2){ return fn(n-1) + fn(n-2) } else if(n==2) { return 2 } else { return 1 } } 复制代码
核心要点解析
可以分解为子问题
也就是返回的递归子问题与当前问题的逻辑拆解关系
这个问题与分解之后的子问题,除了数据规模不同,其他都是相同的
也就是子问题的解法与当前问题是完全一致的,不需要区别写法
有终止条件
不再进行递归的判断条件,并且知道临界条件的特殊值是可求的
实际问题
堆栈溢出
当递归层级过深的时候,因为在递归的过程中会一直把临时变量封装为栈压入内存栈,如果一直压入,就会导致溢出导致服务崩溃。通常的解决方案是设置一个递归深度来进行限制。 比如下面的代码:则假定内存深度为1000,超过1000则抛出异常。
let depth = 0 let f = (n) => { ++depth if(depth>1000) throw error() if(n===1) return 1 return fn(n-1) + 1 } 复制代码
说明:这种不是很实用,因为内存一般是动态变化的,用定值没意义,而如果动态获取内存,又小题大做了。
重复计算
还是上面的递归计算走法的案例,不难发现会重复计算一些中间步骤的走法,导致浪费。当然这种问题不一定会有,和问题的分解有关。
优化方式是针对已经得到结果的走法计到Map缓存中直接使用。
let f = ( n) => { if (n == 1) return 1; if (n == 2) return 2; // hasSolvedList 可以理解成一个 Map,key 是 n,value 是 f(n) if (hasSolvedList.containsKey(n)) { return hasSovledList.get(n); } ley ret = f(n-1) + f(n-2); hasSovledList.put(n, ret); return ret; } 复制代码
无限递归
也就是没有办法找到终止条件的情况要考虑进,主要是避免死循环或者脏数据的影响
总结
本文主要介绍了常见的递归案例,可以用递归的核心点以及递归可能存在的问题。
彩蛋~~ 魔法币挑战
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。 魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币 小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币
如果你对这项游戏的解法有兴趣,就请跳转下面的链接介绍吧,有代码有真相。
以上所述就是小编给大家介绍的《Js来分析递归》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 使用动态分析技术分析 Java
- 使用动态分析技术分析 Java
- 案例分析:如何进行需求分析?
- 深度分析ConcurrentHashMap原理分析
- 如何分析“数据分析师”的岗位?
- EOS源码分析(3)案例分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Windows高级调试
Mario Hewardt、Daniel Pravat / 聂雪军 / 机械工业出版社 / 2009-5 / 79.00元
本书主要讲解Windows高级调试思想和工具,并涉及一些高级调试主题。本书内容主要包括:工具简介、调试器简介、调试器揭密、符号文件与源文件的管理、栈内存破坏、堆内存破坏、安全、进程间通信、资源泄漏、同步、编写定制的调试扩展、64位调试、事后调试、Windows Vista基础以及应用程序验证器的测试设置等。本书内容详实、条理清楚。 本书适合Windows开发人员、Windows测试人员和Windo......一起来看看 《Windows高级调试》 这本书的介绍吧!