我想遞回地產生一個單位 n-hypercube 的頂點(點)(為了清楚起見,這里只是一個立方體)。這個想法是通過遞回地遍歷 x、y 和 z 分量來指定立方體的點。為什么不只使用嵌套的 for 回圈?遞回本質上是贓物。這是我的功能:
var points = [];
function makeCube(d, point) {
console.log(d,point);
if(d == 0) {
points.push(point);
} else {
extension1 = [...point];
extension1.push(0);
extension2 = [...point];
extension2.push(1);
makeCube(d - 1, extension1);
makeCube(d - 1, extension2);
}
}
我打電話makeCube(3, [])。控制臺顯示:
[Log] 3 – [] (0) (sketch.js, line 57)
[Log] 2 – [0] (1) (sketch.js, line 57)
[Log] 1 – [0, 0] (2) (sketch.js, line 57)
[Log] 0 – [0, 0, 0] (3) (sketch.js, line 57)
[Log] 0 – [0, 0, 1] (3) (sketch.js, line 57)
[Log] 1 – [0, 0, 1] (3) (sketch.js, line 57)
[Log] 0 – [0, 0, 1, …] (4) (sketch.js, line 57)
etc...
當 d 為 1 時,陣列中應該只有 2 個條目,而不是 3 個!當 d 為 0 時,應該是 3,而不是 4。最低級別的第二個陣列以某種方式被提升了一個級別。我特意復制了擴展陣列,而不是將它們設定為與舊陣列相等,所以我不明白發生了什么。
預期的控制臺輸出:
[]
[0]
[0,0]
[0,0,0]
[0,0,1]
[0,1]
[0,1,0]
[0,1,1]
[1]
[1,0]
[1,0,0]
[1,0,1]
[1,1]
[1,1,0]
[1,1,1]
uj5u.com熱心網友回復:
我想我解決了這個問題:
var points = [];
function makeCube(d, point) {
console.log(d, JSON.stringify(point));
if(d == 0) {
points.push([...point]);
} else {
let extension1 = [...point];
extension1.push(0);
let extension2 = [...point];
extension2.push(1);
makeCube(d - 1, extension1);
makeCube(d - 1, extension2);
}
}
makeCube(3, [])
3 []
2 [0]
1 [0,0]
0 [0,0,0]
0 [0,0,1]
1 [0,1]
0 [0,1,0]
0 [0,1,1]
2 [1]
1 [1,0]
0 [1,0,0]
0 [1,0,1]
1 [1,1]
0 [1,1,0]
0 [1,1,1]
我剛剛添加了let兩次(并更改了我記錄的內容)。原始腳本在視窗中創建全域變數extension1和變數。extension2顯然,全域范圍引起了一些問題。
uj5u.com熱心網友回復:
您可以使用生成器將副作用 , 移動到console.log函式之外。points這也使得跳過全域變數變得容易。使用for..of回圈遍歷所有點 -
function* makeCube(d, point = []) {
yield point
if(d == 0) return
yield *makeCube(d - 1, [...point, 0])
yield *makeCube(d - 1, [...point, 1])
}
for (const point of makeCube(3))
console.log(`(${point.join(",")})`) // caller decides effect
()
(0)
(0,0)
(0,0,0)
(0,0,1)
(0,1)
(0,1,0)
(0,1,1)
(1)
(1,0)
(1,0,0)
(1,0,1)
(1,1)
(1,1,0)
(1,1,1)
或用于Array.from將所有點收集到一個陣列中
const points = Array.from(makeCube(3))
console.log(points)
[
[],
[0],
[0,0],
[0,0,0],
[0,0,1],
[0,1],
[0,1,0],
[0,1,1],
[1],
[1,0],
[1,0,0],
[1,0,1],
[1,1],
[1,1,0],
[1,1,1],
]
如果您想計算product,我建議您以不同的方式撰寫函式 -
function* product(t, ...more) {
if (t == null) return yield []
for (const p of product(...more))
for (const v of t)
yield [v, ...p]
}
for (const p of product([0,1], [0,1], [0,1]))
console.log(p.join(","))
for (const p of product(["J", "Q", "K", "A"], ['?', '?', '?', '?']))
console.log(p.join(""))
0,0,0
1,0,0
0,1,0
1,1,0
0,0,1
1,0,1
0,1,1
1,1,1
J?
Q?
K?
A?
J?
Q?
K?
A?
J?
Q?
K?
A?
J?
Q?
K?
A?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461006.html
標籤:javascript 递归
