这个递归函数如何结束?

时间:2015-11-12 19:20:27

标签: javascript arrays recursion

这是来自nodeschool的功能性javascript研讨会。这是它出现的代码:

function toUpperArray(items) {
    if (!items.length) return []    // end condition
    var head = items[0]             // item to operate
    head = head.toUpperCase()       // perform action
    var tail = items.slice(1)       // next
    return [head].concat(toUpperArray(tail))    // recursive step
}

toUpperArray(['hello', 'world']) // => ['HELLO', 'WORLD']

我不明白“结束条件”是如何起作用的。我认为条件是将items.length寻找为0,但是它返回一个空数组?我尝试通过让它返回任何东西来运行它,返回undefined因此将undefined添加到最终数组,但我不确定为什么返回一个空数组修复此问题。我希望最后一个数组中的最后一项是一个空数组。

另外,我从未见过没有使用花括号的条件。这有意义吗?

5 个答案:

答案 0 :(得分:2)

当数组为空时。即items.length == 0。以下条件是!= 0的缩写形式,因为0在javascript中为false值,而0不应为true

if (!items.length) return [];

答案 1 :(得分:2)

这是因为concat函数调用Array并且Array作为参数产生Array作为结果。基本上你可以用这种方式看到它:

  • 空数组的上部数组是空数组(基本情况)
  • 具有至少一个元素的数组的上部数组(将其视为element,[array])通过递归调用(递归步骤)与数组的尾部连接element.toUpperCase()

基本上你有一个数组data = [e1, e2, ..., en]和一个函数f(x)。你想返回[f(e1), f(e2), ..., f(en)],所以你基本上在数组的第一个元素上应用函数,并将结果与​​同一个数组上没有第一个元素的同一递归函数返回的值连接起来。

答案 2 :(得分:1)

当items.length将为eqal为0(false)时,该函数将返回一个空数组,并将递归递归调用堆栈。以下是我们写这种情况的几种方式:

if(!items.length) //true
if(items.length == 0) //true
if(items.length == false) //true

对于没有花括号的条件。它做了同样的事情,只是它只将当前行或下一行作为"内容"你的病情:

if(randomBoolean)
    console.log('this is executed');

console.log('this is always executed');

在该示例中,如果randomBoolean变量为true,则输出将为:

this is executed
this is always executed

如果randomBoolean变量为false,您会看到:

this is always executed

答案 3 :(得分:1)

function toUpperArray(items) {
    if (!items.length) return []    // end condition
    var head = items[0]             // item to operate
    head = head.toUpperCase()       // perform action
    var tail = items.slice(1)       // next
    return [head].concat(toUpperArray(tail))    // recursive step
}
  • 第1行:如果数组中没有剩余项目, 返回一个没有任何内容的数组。
  • 第2行:获取给定数组的第一项
  • 第3行:将其转换为大写字母
  • 第4行:创建一个没有刚刚转换的项目的新数组
  • 第5行:使用剩余数组调用该函数,将其与转换后的项目连接并返回。

会发生什么?让我们举个例子:

[X,Y]表示你有一个数组[0] = X,数组[1] = Y的数组。所以你有项目[0] ='你好',项目[1] ='世界'。

第一个电话是改变你好'到' HELLO'。

剩下的数组是[' world']。

然后再次调用该函数并将其转换为' WORLD'。

然后再次调用它,没有项目然后它返回一个空数组。这意味着第二次通话也可以通过将[' WORLD']与[]结合来返回。

然后第一个电话可以通过[' HELLO']和[' WORLD']汇总返回,这是[' HELLO' WORLD' 39;]

答案 4 :(得分:-2)

它将数组中的所有值转换为UPPERCASE。

可以使用for循环,但它们基本上只是再次为 next 数组值调用该函数。