我是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);
全部
答案 0 :(得分:1)
首先,您可以使用join()
方法:
const userNames = ['Elon', 'Susan', 'Bill', 'Marika', 'Ryan'];
console.log(userNames.join(' - '));
&#13;
无论如何,你的递归函数很有意思。
当您使用参数5调用console.log(names);
时,问题是name()
,并且在该函数调用中它是未定义的。
您希望console.log()
第一次通话的结果;
为避免最后一次调用未定义,只需返回一个空字符串
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;
答案 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中将其编码为递归函数是微不足道的 - 请注意,不需要跟踪数组索引或担心增加迭代器 - 只需考虑履行合同
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;
当然,如果我们允许用户指定加入字符串
,我们的功能可以大大改进
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;