我是代码领域的初学者。我很难理解JavaScript中的递归,尤其是当它需要两个或多个循环时。就像我想使用递归打印矩形。我不完全知道如何制作一个基本案例,条件何时仍然执行。例如,下面这些代码用于打印矩形或多孔矩形。
function box(num) {
for (let i = 0; i < num; i++) {
let str = ''
for (let j = 0; j < num; j++) {
str += '*'
}
console.log(str)
}
}
box(5)
function holeBox (num) {
for(let i = 0; i < num; i++){
let str = ''
for(let j = 0; j < num; j++){
if(i == 0 || i == num -1 || j == 0 || j == num - 1) {
str += '*'
} else {
str += ' '
}
}
console.log(str)
}
}
holeBox (5)
请帮助我理解递归,一个很好的解释。我的目标不仅是解决这些代码,而且要理解递归的工作原理。我搜索了没有足够的资源来学习递归,或者我太笨了,无法理解。预先感谢
答案 0 :(得分:2)
要了解递归的工作原理,只需考虑如何将要完成的任务分解为较小的任务,以及该函数如何完成其中一项任务,然后调用自身执行下一个任务,依此类推,直到完成了。我个人不认为打印盒是学习递归的最佳方法,因此,想象一下您想在数组中搜索特定的值。现在忽略JavaScript的indexOf()/find()
函数或类似函数。
要使用循环执行此操作,很简单,只需遍历数组并检查每个值:
//Returns the index of the first occurrence of a value in an array, or -1 if nothing is found
function search(needle, haystack) {
for (let i = 0; i < haystack.length; i++) {
if (haystack[i] == needle) return i;
}
return -1;
}
使用递归操作也很容易:
function recursiveSearch(needle, haystack, i) {
if (i > (haystack.length - 1)) return -1; //check if we are at the end of the array
if (haystack[i] == needle) return i; //check if we've found what we're looking for
//if we haven't found the value yet and we're not at the end of the array, call this function to look at the next element
return recursiveSearch(needle, haystack, i + 1);
}
这些函数执行相同的操作,只是有所不同。在递归函数中,两个if语句是基本情况。功能:
请注意,通常从其他辅助函数中调用递归函数,因此您不必传递初始参数即可调用该函数。例如,上面的recursiveSearch()
函数将是私有的,并且将由另一个函数调用,例如:
function search(needle, haystack) {
return recursiveSearch(needle, haystack, 0);
}
所以我们在调用它时不必包含第三个参数,从而减少了混乱。
答案 1 :(得分:1)
是的,即使您的Box代码也可以转换为递归,但是我认为这不会帮助您理解递归的概念。
如果您确实需要:
function getBox(arr, size) {
let length = arr.length;
if (length == size)
return arr; // recursion stop rule - if the size reached
for (let i = 0; i < length; i++)
arr[i].push("*"); // fill new size for all row
arr.push(new Array(length + 1).fill("*")); // add new row
return getBox(arr, size); // recursive call with arr bigger in 1 row
}
但是,我相信@Gumbo的答案比这更好地解释了这个概念...