递归函数数组到字符串javascript

时间:2017-05-16 18:00:06

标签: javascript arrays recursion

我是javascript的初学者。 我必须执行递归函数,允许我输出数组的串联名称作为字符串。 很少,我在那里,除了我的最后一个值是未定义的

const userNames = ['Elon', 'Susan', 'Bill', 'Marika', 'Ryan'];

function name(i) {
  if (i < userNames.length) {
  var names = userNames[i] + ' - ' + name(++i);
   return names;
 } else {
   console.log(names);
 };
}
name(0);

全部

3 个答案:

答案 0 :(得分:1)

首先,您可以使用join()方法:

&#13;
&#13;
const userNames = ['Elon', 'Susan', 'Bill', 'Marika', 'Ryan'];
console.log(userNames.join(' - '));
&#13;
&#13;
&#13;

无论如何,你的递归函数很有意思。 当您使用参数5调用console.log(names);时,问题是name(),并且在该函数调用中它是未定义的。

您希望console.log()第一次通话的结果;

为避免最后一次调用未定义,只需返回一个空字符串

&#13;
&#13;
const userNames = ['Elon', 'Susan', 'Bill', 'Marika', 'Ryan'];

function name(i) {
  if (i < userNames.length) {
   var names = userNames[i];
   let n = name(++i);
   return names + (n ? ' - ' + n : '');
 } else {
   return '';
 }
}
console.log(name(0));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

问题是您将递归代码与用于在末尾打印字符串的代码混合在一起。递归通话会触及其他&#39;阻止并落到函数的末尾。由于没有&#39;返回&#39;在函数末尾定义,最后一个名称(++ i)&#39;呼叫评估为未定义的&#39;这与原始字符串连接。这有两个解决方案:

const userNames = ['Elon', 'Susan', 'Bill', 'Marika', 'Ryan'];

function name(i) {
  if (i === userNames.length) {
      return '';
  }
  else {
   return userNames[i] + ' - ' + name(++i);
 }
}

function printList() {
    console.log(name(0))
}

printList();

const namesList = ['Elon', 'Susan', 'Bill', 'Marika', 'Ryan'];

function name(i) {
  if (i < userNames.length) {
  var names = userNames[i] + ' - ' + name(++i);
   return names;
 } else {
   console.log(names);
   return '';
 };
}
name(0);

答案 2 :(得分:0)

首先考虑一下你的功能的完整领域。您的函数接受一个字符串数组。该数组可以包含0,1或更多字符串,我们需要您的函数适用于该

的所有情况
// contract
joinStrings([])      == ''
joinStrings([a])     == a
joinStrings([a,b])   == a + '-' + b
joinStrings([a,b,c]) == a + '-' + b + '-' + c

在JavaScript中将其编码为递归函数是微不足道的 - 请注意,不需要跟踪数组索引或担心增加迭代器 - 只需考虑履行合同

&#13;
&#13;
const joinStrings = xs => {
  switch (xs.length) {
    case 0:   return ''
    case 1:   return xs[0]
    default:  return xs[0] + '-' + joinStrings(xs.slice(1))
  }
}

console.log(joinStrings([]))               // ''
console.log(joinStrings(['a']))            // 'a'
console.log(joinStrings(['a', 'b']))       // 'a-b'
console.log(joinStrings(['a', 'b', 'c']))  // 'a-b-c'
&#13;
&#13;
&#13;

当然,如果我们允许用户指定加入字符串

,我们的功能可以大大改进

&#13;
&#13;
const joinStrings = (y, xs) => {
  switch (xs.length) {
    case 0:   return ''
    case 1:   return xs[0]
    default:  return xs[0] + y + joinStrings(y, xs.slice(1))
  }
}

console.log(joinStrings('&', []))               // ''
console.log(joinStrings('&', ['a']))            // 'a'
console.log(joinStrings('&', ['a', 'b']))       // 'a&b'
console.log(joinStrings('&', ['a', 'b', 'c']))  // 'a&b&c'
&#13;
&#13;
&#13;