说明Rectangle Recursion JavaScript如何工作

时间:2019-01-12 20:47:01

标签: javascript loops recursion

我是代码领域的初学者。我很难理解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)

请帮助我理解递归,一个很好的解释。我的目标不仅是解决这些代码,而且要理解递归的工作原理。我搜索了没有足够的资源来学习递归,或者我太笨了,无法理解。预先感谢

2 个答案:

答案 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语句是基本情况。功能:

  1. 测试当前元素是否超出数组范围(意味着我们已经搜索了每个元素),如果是,则返回-1
  2. 测试当前元素是否是我们要寻找的元素,如果是,则返回索引
  3. 如果以上两种陈述均不适用,我们将递归调用此函数以检查下一个元素
  4. 重复此操作,直到出现一个基本案例。

请注意,通常从其他辅助函数中调用递归函数,因此您不必传递初始参数即可调用该函数。例如,上面的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的答案比这更好地解释了这个概念...