js递归时有多个结束条件的实现方法

JavaScript07

js递归时有多个结束条件的实现方法,第1张

// 数组中表示前一种语言对后一种语言有影响var influences = [

['Lisp', 'Smalltalk'],

['Lisp', 'Scheme'],

['Smalltalk', 'Self'],

['Scheme', 'JavaScript'],

['Scheme', 'Lua'],

['Self', 'Lua'],

['Self', 'JavaScript']]// 获得受某种语言直接影响的语言的列表function nexts(graph, node) {  if (_.isEmpty(graph)) return [] var pair = _.first(graph) var from = _.first(pair) var to   = second(pair) var more = _.rest(graph) if (_.isEqual(node, from))    return construct(to, nexts(more, node)) else

return nexts(more, node)

}

nexts(influences, 'Lisp')// 输出: ["Smalltalk", "Schema"]

后面又给了一个练习题,让nexts能够遍历多个节点。我理解这个练习题的要求是:

参数:influences, nodes (例如['Lisp', 'Self'])

输出:

{

Lisp: ["Smalltalk", "Schema"],

Self: ["Lua", "JavaScript"]

感觉这个递归有两个结束条件:

_.isEmpty(graph) 表示当前节点递归完了

_.isEmpty(nodes) 表示所有节点递归完了

想了半天,除了在nexts外层套一个循环外,没能写出很好的递归方法。

希望各路大神能给一个思路,如果能给出一个多条件递归时的思路总结,说明一下这种问题应如果分解,就再好不过了。

写了一个示例,里面包含了执行环境和用到的工具函数,可以在这里实验。

求 1-100 的和

1,1,2,3,5,8,13,21,34,55,89...求第 n 项

JS 递归 假如楼梯有 n 个台阶,每次可以走 1 个或 2 个台阶,请问走完这 n 个台阶有几种走法

原理: clone(o) = new Object返回一个对象

1、很多时候可以用递归代替循环,可以理解为递归是一种特殊的循环,但通常情况下不推荐这样做。

2、递归一般是在函数里面把函数自己给调用一遍,通过每次调用改变条件,来结束循环。

3、递归在数据格式一致,在数据层级未知的情况下,比普通的遍历更有优势。

4、递归在异步的时候,更容易理解,且更容易实现,因为可以在异步的回调里面,调用自己来实现每次都能拿到异步的结果再进行其他操作。

5、递归实现的快速排序比普通遍历实现的排序效率更好。

我先来解释无限递归

先举一个生活中的例子,就是那个经典的《老和尚给小和尚讲故事》的故事:

从前有座山,山里有个庙,庙里有个老和尚给小和尚讲故事。

讲的是什么故事呢?

讲的是:

从前有座山,山里有个庙……

这就是无限递归了。

再来说一下你的程序发生无限递归的原因:

ajQuery 是一个函数。执行这个函数时,函数中的 return 语句会返回一个值。

它会返回什么值呢?

返回值是执行一个新的 ajQuery 函数的返回值,

那么这个新的 ajQuery 函数会返回什么值呢?

这个新的 ajQuery 函数会返回又一个新的 ajQuery 函数的返回值,

……

这是无限递归,也是一种死循环。

最后说一下发生溢出的原因:

每次执行 ajQuery 函数,

都会在结束前执行又一个新的 ajQuery 函数,

并等待它结束,然后自身才能结束。

每执行一个函数都要占用一些资源,只有函数结束后才有可能释放这些资源。

可是,在无限递归过程中,不断地执行一个又一个函数,却从不结束这些函数。

所以,占用的资源就会越来越多。

直到占用的资源超出了允许的范围,就溢出了!