JS中find函数返回null的执行逻辑及24匹配解的求解过程分析
问题1:递归函数find返回null时的执行逻辑
find返回null代表当前递归分支已经没有可行解(当前计算值超过目标值),此时会触发JavaScript的||短路求值逻辑:
- 如果是
find(current + 5, ...)返回了null,程序会自动执行||右侧的find(current * 3, ...),尝试乘3的分支 - 如果两个分支调用都返回null,当前层递归整体会向上层返回null,代表当前路径完全走不通,程序回溯到上一层递归,尝试上层未走的其他分支。
问题2:匹配数字24的求解过程
程序采用深度优先搜索策略,从初始值1出发,优先尝试加5的分支,走不通再回溯尝试乘3的分支,具体执行路径如下:
- 初始调用
find(1, '1'),1小于24,先尝试加5分支:find(6, '(1 + 5)') - 6小于24,继续优先加5,依次得到11、16、21,所有加5分支走到头后,21加5得26(超过24)、乘3得63(超过24),全部分支返回null,逐层回溯到6的节点
- 6的加5分支全失败,尝试乘3分支得到18,18加5得23(两个分支都超过24)、乘3得54(超过24),全部分支返回null,回溯到初始1的节点
- 初始1的加5分支全失败,尝试乘3分支:
find(3, '(1 * 3)') - 3小于24,优先加5得到8,8加5得到13,13加5得到18,18所有分支失败回溯到8的节点
- 8的加5分支失败,尝试乘3分支:
find(24, '(((1 * 3) + 5) * 3)') - 此时当前值等于目标值24,直接返回历史运算字符串,求解成功,最终输出结果为
(((1 * 3) + 5) * 3)。
内容的提问来源于stack exchange,提问作者Pallab Biswas
相关产品推荐
相关产品推荐

