Can';无法获取javascript递归

Can';无法获取javascript递归,javascript,recursion,Javascript,Recursion,这个例子来自Eloquant javascript,我不知道它是如何工作的。我从其他基本示例中了解了递归的基本工作原理。有人能告诉我这是怎么回事吗 下面的链接对此进行了解释。 当第15行调用函数findSolution时,24被传递给target。在函数findSolution中,定义了另一个函数find。然后在第12行使用find(1,“1”)调用此函数,从而启动递归。在这个递归的第一个过程中,检查递归是否完成。当start等于target(第3行)时会发生这种情况,这是前面为findSol

这个例子来自Eloquant javascript,我不知道它是如何工作的。我从其他基本示例中了解了递归的基本工作原理。有人能告诉我这是怎么回事吗

下面的链接对此进行了解释。

当第15行调用函数
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