Can';无法获取javascript递归
这个例子来自Eloquant javascript,我不知道它是如何工作的。我从其他基本示例中了解了递归的基本工作原理。有人能告诉我这是怎么回事吗 下面的链接对此进行了解释。 当第15行调用函数Can';无法获取javascript递归,javascript,recursion,Javascript,Recursion,这个例子来自Eloquant javascript,我不知道它是如何工作的。我从其他基本示例中了解了递归的基本工作原理。有人能告诉我这是怎么回事吗 下面的链接对此进行了解释。 当第15行调用函数findSolution时,24被传递给target。在函数findSolution中,定义了另一个函数find。然后在第12行使用find(1,“1”)调用此函数,从而启动递归。在这个递归的第一个过程中,检查递归是否完成。当start等于target(第3行)时会发生这种情况,这是前面为findSol
findSolution
时,24被传递给target
。在函数findSolution
中,定义了另一个函数find
。然后在第12行使用find(1,“1”)
调用此函数,从而启动递归。在这个递归的第一个过程中,检查递归是否完成。当start
等于target
(第3行)时会发生这种情况,这是前面为findSolution
(第15行)给出的值。在这种情况下,它不会在第一次通过时进行,因此它将进入第5行的下一部分。在这一行,它检查起始值是否超出目标值,如果超出目标值,则返回null。如果没有,则转到第9行,该行使用当前的start
值(第一次传递时为1)加上5(so 6),递归调用find
,如果失败(返回null[参见第6行]),则第10行的第二次调用将由于|
运算符而发生。这将尝试start*3
,在第一次通过时,这是1*3
,或3。这将一直持续,直到它将start
值相加或相乘为止
简言之,递归通过
find
进行,而start没有到达目标。当start
值与target
(第3行)完全匹配时,或者由于第5行的测试而无法达到目标时,它结束,该测试不允许start+5
或start*3
超出该值。首先,您需要了解内部函数的返回是如何工作的
return func(A) || func(B)
如果func(A)不为null,则返回func(B)
现在我们的目标是24,起点是find(1,1)
(触发递归函数的外部函数的返回值)
查找(1,1)可能有两种可能的输出:
A: find(6, (1+5))
or
B find(3, (1*3))
除非我们从a获得空返回(或达到目标),否则B将处于保留状态,因此我们继续使用a,返回将为:
Aa: find(11, ((1+5)+5))
or
Ab: find(15, ((1+5)*3))
Ab再次暂停,我们继续Aa,Aa将返回:
Aa1: find(16, (((1+5)+5)+5))
Aa2: find(33, (((1+5)+5)*3))
Aa2比目标(24)大,因此它永远不会继续。因此,我们继续使用Aa1,它将返回21,然后是25,它通过目标并返回null。所以我们回到Ab,它返回45>目标。所以A
无论如何都返回null,现在我们尝试B:
Ba: find(8, ((1*3)+5))
Bb: find(9, ((1*3)*3))
继续使用Ba,然后返回:
Ba1: find(13, (((1*3)+5)+5))
Ba2: find(24, (((1*3)+5)*3))
我们继续使用Ba1,它将返回18,然后返回23,然后返回28,这比目标值大,因此为空。因此,返回到Ba2
,即24==target
,完成计算并返回其历史记录,即:
(((1*3)+5)*3)
您可以查看所有端点的日志(当达到null或最终找到匹配项时) 编辑:
这是函数的执行方式:
//instead of find I use f
findSolution(24) >
f(1, 1) >
f(6, (1+5)) >
f(11, ((1+5)+5)) >
f(16, (((1+5)+5)+5)) >
f(21, ((((1+5)+5)+5)+5)) >
f(26, (((((1+5)+5)+5)+5)+5)) > NULL
f(63, (((((1+5)+5)+5)+5)*3)) > NULL
f(48, ((((1+5)+5)+5)*3)) > NULL
f(33, (((1+5)+5)*3)) > NULL
f(18, ((1+5)*3)) >
f(23, (((1+5)*3)+5)) >
f(28, ((((1+5)*3)+5)+5)) > NULL
f(69, ((((1+5)*3)+5)*3)) > NULL
f(54, (((1+5)*3)+5)) > NULL
f(3, (1*3)) >
f(8, ((1*3)+5)) >
f(13, (((1*3)+5)+5)) >
f(18, ((((1*3)+5)+5)+5)) >
f(23, (((((1*3)+5)+5)+5)+5)) >
f(28, ((((((1*3)+5)+5)+5)+5)+5)) > NULL
f(69, ((((((1*3)+5)+5)+5)+5)*3)) > NULL
f(54, (((((1*3)+5)+5)+5)*3)) > NULL
f(39, ((((1*3)+5)+5)*3)) > NULL
f(24, (((1*3)+5)*3)) > MATCH
重复的,我认为这应该是一个很好的解释,但我就是不能让它在我的大脑中工作。。我觉得自己很愚蠢。。我自己我会一直思考直到我明白。。谢谢大家。我想我明白了。非常感谢武士们。jsdiffle演示帮助很大。不用担心,添加了执行树,因此可能会有更多帮助。
(((1*3)+5)*3)
//instead of find I use f
findSolution(24) >
f(1, 1) >
f(6, (1+5)) >
f(11, ((1+5)+5)) >
f(16, (((1+5)+5)+5)) >
f(21, ((((1+5)+5)+5)+5)) >
f(26, (((((1+5)+5)+5)+5)+5)) > NULL
f(63, (((((1+5)+5)+5)+5)*3)) > NULL
f(48, ((((1+5)+5)+5)*3)) > NULL
f(33, (((1+5)+5)*3)) > NULL
f(18, ((1+5)*3)) >
f(23, (((1+5)*3)+5)) >
f(28, ((((1+5)*3)+5)+5)) > NULL
f(69, ((((1+5)*3)+5)*3)) > NULL
f(54, (((1+5)*3)+5)) > NULL
f(3, (1*3)) >
f(8, ((1*3)+5)) >
f(13, (((1*3)+5)+5)) >
f(18, ((((1*3)+5)+5)+5)) >
f(23, (((((1*3)+5)+5)+5)+5)) >
f(28, ((((((1*3)+5)+5)+5)+5)+5)) > NULL
f(69, ((((((1*3)+5)+5)+5)+5)*3)) > NULL
f(54, (((((1*3)+5)+5)+5)*3)) > NULL
f(39, ((((1*3)+5)+5)*3)) > NULL
f(24, (((1*3)+5)*3)) > MATCH