Sitemap

JavaScript Basics 20

Recursive equivalent to nested for loops.

It is useful to dynamically create a list of array indices, for array indexing.

Non-dynamic indice list creation

var r = 4;
var c = 3; // this is signified by the number of for loops, and fixed [i,j,k]

var tot = [];

for (var i=0; i<r; i++) {
for (var j=0; j<r; j++) {
for (var k=0; k<r; k++) {
tot.push([i,j,k])
}
}
}

console.log("tot: ", tot);

Results

"tot: " Array [Array [0, 0, 0], Array [0, 0, 1], Array [0, 0, 2], Array [0, 0, 3], Array [0, 1, 0], Array [0, 1, 1], Array [0, 1, 2], Array [0, 1, 3], Array [0, 2, 0], Array [0, 2, 1], Array [0, 2, 2], Array [0, 2, 3], Array [0, 3, 0], Array [0, 3, 1], Array [0, 3, 2], Array [0, 3, 3], Array [1, 0, 0], Array [1, 0, 1], Array [1, 0, 2], Array [1, 0, 3], Array [1, 1, 0], Array [1, 1, 1], Array [1, 1, 2], Array [1, 1, 3], Array [1, 2, 0], Array [1, 2, 1], Array [1, 2, 2], Array [1, 2, 3], Array [1, 3, 0], Array [1, 3, 1], Array [1, 3, 2], Array [1, 3, 3], Array [2, 0, 0], Array [2, 0, 1], Array [2, 0, 2], Array [2, 0, 3], Array [2, 1, 0], Array [2, 1, 1], Array [2, 1, 2], Array [2, 1, 3], Array [2, 2, 0], Array [2, 2, 1], Array [2, 2, 2], Array [2, 2, 3], Array [2, 3, 0], Array [2, 3, 1], Array [2, 3, 2], Array [2, 3, 3], Array [3, 0, 0], Array [3, 0, 1], Array [3, 0, 2], Array [3, 0, 3], Array [3, 1, 0], Array [3, 1, 1], Array [3, 1, 2], Array [3, 1, 3], Array [3, 2, 0], Array [3, 2, 1], Array [3, 2, 2], Array [3, 2, 3], Array [3, 3, 0], Array [3, 3, 1], Array [3, 3, 2], Array [3, 3, 3]]

Recursive equivalent (Dynamic)

var r = 4;
var c = 3;

var tot = [];

main();

function main() {
var r_cnt = 0;
var arr = Array.from({length:r}, (v,i) => { return i; });

recur_rows(arr, r_cnt, r);
tot = tot.flat(2);
console.log("tot: ", tot);
}


function recur_rows(arr, r_cnt, r) {
var out = Array.from({length:r}, (v,rcur) => { return recur_cols(arr, r_cnt, rcur); });
tot.push(out);
if (r_cnt < r-1) {
r_cnt = r_cnt + 1;
recur_rows(arr, r_cnt, r);
}
}




function recur_cols(arr, r_cnt, rcur) {
// console.log("r_cnt: ", r_cnt);
// console.log("rcur: ", rcur);

if (c == 2) {
// For 2 columns
return [arr[r_cnt]].concat([arr[rcur]]);
} else if (c == 3) {
// For 3 columns
return arr.map((v,j) => { return [arr[r_cnt]].concat([arr[rcur]].concat([j])).flat(); });
}
}

Results

"tot: " Array [Array [0, 0, 0], Array [0, 0, 1], Array [0, 0, 2], Array [0, 0, 3], Array [0, 1, 0], Array [0, 1, 1], Array [0, 1, 2], Array [0, 1, 3], Array [0, 2, 0], Array [0, 2, 1], Array [0, 2, 2], Array [0, 2, 3], Array [0, 3, 0], Array [0, 3, 1], Array [0, 3, 2], Array [0, 3, 3], Array [1, 0, 0], Array [1, 0, 1], Array [1, 0, 2], Array [1, 0, 3], Array [1, 1, 0], Array [1, 1, 1], Array [1, 1, 2], Array [1, 1, 3], Array [1, 2, 0], Array [1, 2, 1], Array [1, 2, 2], Array [1, 2, 3], Array [1, 3, 0], Array [1, 3, 1], Array [1, 3, 2], Array [1, 3, 3], Array [2, 0, 0], Array [2, 0, 1], Array [2, 0, 2], Array [2, 0, 3], Array [2, 1, 0], Array [2, 1, 1], Array [2, 1, 2], Array [2, 1, 3], Array [2, 2, 0], Array [2, 2, 1], Array [2, 2, 2], Array [2, 2, 3], Array [2, 3, 0], Array [2, 3, 1], Array [2, 3, 2], Array [2, 3, 3], Array [3, 0, 0], Array [3, 0, 1], Array [3, 0, 2], Array [3, 0, 3], Array [3, 1, 0], Array [3, 1, 1], Array [3, 1, 2], Array [3, 1, 3], Array [3, 2, 0], Array [3, 2, 1], Array [3, 2, 2], Array [3, 2, 3], Array [3, 3, 0], Array [3, 3, 1], Array [3, 3, 2], Array [3, 3, 3]]

Get Practicing DatScy’s stories in your inbox

Join Medium for free to get updates from this writer.

Good Luck and Happy Practicing! 👋

💻 GitHub | 🔔 Subscribe to Practicing Datscy @ Medium | 🌷 Practicing Datscy @ Dev.to

Written by Practicing DatScy

Practicing coding and Data Science. Blog brand: Use logic in a clam space, like a forest, and use reliable, clear, and informative Data Science workflows!