扫码关注官方订阅号
有个逻辑题,给出总数楼梯,每次最多可走3步楼梯如: 总数楼梯3步有如下:
1 1 1 1 2 2 1 3
请问用js如何实现这样的递归?
-----补充---这个数组有点看不懂,第一个显示3,但length有7,这是为什么呢?希望解答下,还有其余三个。
0 function dfs(n, arr) { 1 for (var i = Math.min(n, 3); i > 0; i--) { 2 arr.push(i); 3 if (n - i > 0) dfs(n - i, arr); 4 else document.write(arr + '<br/>'); 5 arr.pop(); 6 } 7 } 8 dfs(4, []);
arr 是个临时列表 保存一种组合情况用的 必须在函数调用的外面创建 不能在递归函数里创建
arr
就拿我最下面那个4的例子把程序跑一遍
第8行 开始调用dfs(4, [])
dfs(4, [])
第1行 n=4 i=3 arr=[]
n=4
i=3
arr=[]
第2行 n=4 i=3 arr=[3]
arr=[3]
第3行 递归调用dfs(4-3, [3])
dfs(4-3, [3])
第1行 n=1 i=1 arr=[3]
n=1
i=1
第2行 n=1 i=1 arr=[3,1]
arr=[3,1]
第3行 n-i>0不成立 不再递归
n-i>0
第4行 打印arr([3,1])
[3,1]
第5行 把arr最后一个元素删掉 arr=[3]
第1行 n=1 i=0 arr=[3] 退出循环 递归终止
i=0
第5行 把arr最后一个元素删掉 arr=[]
第1行 n=4 i=2 arr=[]
i=2
第2行 n=4 i=2 arr=[2]
arr=[2]
第3行 递归调用dfs(4-2, [2])
dfs(4-2, [2])
第1行 n=2 i=2 arr=[2]
n=2
第2行 n=2 i=2 arr=[2,2]
arr=[2,2]
第4行 打印arr([2,2])
[2,2]
第5行 把arr最后一个元素删掉 arr=[2]
第1行 n=2 i=1 arr=[2]
第2行 n=2 i=1 arr=[2,1]
arr=[2,1]
第3行 递归调用dfs(2-1, [2,1])
dfs(2-1, [2,1])
第1行 n=1 i=1 arr=[2,1]
第2行 n=1 i=1 arr=[2,1,1]
arr=[2,1,1]
第4行 打印arr([2,1,1])
[2,1,1]
第5行 把arr最后一个元素删掉 arr=[2,1]
第1行 n=1 i=0 arr=[2,1] 退出循环 递归终止
...
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
arr是个临时列表 保存一种组合情况用的 必须在函数调用的外面创建 不能在递归函数里创建就拿我最下面那个4的例子把程序跑一遍
第8行 开始调用
dfs(4, [])第1行
n=4i=3arr=[]第2行
n=4i=3arr=[3]第3行 递归调用
dfs(4-3, [3])第1行
n=1i=1arr=[3]第2行
n=1i=1arr=[3,1]第3行
n-i>0不成立 不再递归第4行 打印
arr([3,1])第5行 把
arr最后一个元素删掉arr=[3]第1行
n=1i=0arr=[3]退出循环 递归终止第5行 把
arr最后一个元素删掉arr=[]第1行
n=4i=2arr=[]第2行
n=4i=2arr=[2]第3行 递归调用
dfs(4-2, [2])第1行
n=2i=2arr=[2]第2行
n=2i=2arr=[2,2]第3行
n-i>0不成立 不再递归第4行 打印
arr([2,2])第5行 把
arr最后一个元素删掉arr=[2]第1行
n=2i=1arr=[2]第2行
n=2i=1arr=[2,1]第3行 递归调用
dfs(2-1, [2,1])第1行
n=1i=1arr=[2,1]第2行
n=1i=1arr=[2,1,1]第3行
n-i>0不成立 不再递归第4行 打印
arr([2,1,1])第5行 把
arr最后一个元素删掉arr=[2,1]第1行
n=1i=0arr=[2,1]退出循环 递归终止...