我正在尝试在javascript中创建一个函数,该函数将使用破折号扩展/拆分字符串并使用递归显示进程(逐行)。
例如,字符串“anna”将成为:expand("anna") = expand("an")+"---"+expand("na") ->
"a"+"---"+"n"+"---"+"n"+"---"+"a"
,所需的输出为:
anna
an---na
a---n---n---a
到目前为止,我已经完成了以下任务(我知道这可能不是我正在寻找的解决方案):
expand("anna") = an+"---"+expand("na")
= an+"---"+n+"---"+expand("a");
= an+"---"+n+"---+"a"
我得到的输出是:
an---n---a
我似乎无法将头部连接到第一个例子。
我的扩展javascript功能如下:
function expand(word) {
if (word.length<=1) {
return word;
} else {
mid = word.length/2;
return word.substr(0,mid) + " " + expand(word.substr(mid,word.length));
}
}
document.write(expand("anna"));
我需要一些提示来做到这一点,否则(如果这是错误的stackexchange论坛),请指导我在哪里发布。
答案 0 :(得分:2)
这是我疯狂的尝试
var Word = function(str) {
this.isSplitable = function() {
return str.length > 1;
}
this.split = function() {
var p = Math.floor(str.length / 2);
return [
new Word(str.substr(0,p)),
new Word(str.substr(p,p+1))
];
}
this.toString = function() {
return str;
}
}
var expand = function(words) {
var nwords = [];
var do_recur = false;
words.forEach(function(word){
if(word.isSplitable()) {
var splitted = word.split();
nwords.push(splitted[0]);
nwords.push(splitted[1]);
do_recur = true;
}else{
nwords.push(word);
}
});
var result = [];
nwords.forEach(function(word){
result.push( word.toString() );
});
var result = result.join("--") + "<br/>";
if(do_recur) {
return result + expand(nwords);
}else{
return "";
}
}
document.write( expand([new Word("anna")]) );
答案 1 :(得分:1)
正如我所说,不可能显示&#34;过程&#34;使用递归时递归的步骤,这是一个解决方法,将输出您想要的步骤:
var levels = [];
function expand(word, level) {
if (typeof level === 'undefined') {
level = 0;
}
if (!levels[level]) {
levels[level] = [];
}
levels[level].push(word);
if (word.length <= 1) {
return word;
} else {
var mid = Math.ceil(word.length/2);
return expand(word.substr(0, mid), level+1) + '---' + expand(word.substr(mid), level+1);
}
}
expand('anna');
for (var i = 0; i < levels.length; i++) {
console.log(levels[i].join('---'));
}
答案 2 :(得分:1)
这就是你需要的
expand = function(word) {
return [].map.call(word, function(x) {return x+'---'}).join('')
};
函数式编程的乐趣。
并添加了处理最后一个字符的代码:
function expand(word) {
return [].map.call(word, function(x, idx) {
if (idx < word.length - 1)
return x+'---';
else return x
}).join('')
}
答案 3 :(得分:0)
你必须返回字符串的两个部分:
function expand(word) {
output="";
if (word.length<=1) {
output+=word;
return output;
} else
{
var mid = word.length/2;
output+=word.substr(0,mid)+"---"+word.substr(mid)+" \n";//this line will show the steps.
output+=expand(word.substr(0,mid))+"---"+expand(word.substr(mid,word.length-1))+" \n";
return output;
}
}
console.log(expand("anna"));
修改强>
我添加了output
var,并在每个循环中将新输出连接到它。
应该这样做。
答案 4 :(得分:0)
看到我要做的最好的所有步骤是:
function expand(word) {
if (word.length<=1) {
return word;
} else {
var mid = word.length/2;
var str1 = word.substr(0,mid);
var str2 = word.substr(mid,word.length);
document.write(str1 + "---" + str2 + "<br></br>");
return expand(str1) + "---" + expand(str2);
}
}
document.write(expand("anna"));
答案 5 :(得分:-1)
希望问题出在第一部分。根据您的算法,您将字符串anna分成两部分,
&amp;娜
因此您需要展开两个零件,直到零件长度小于或等于一。所以你需要的功能就在下面。
function expand(word) {
if (word.length<=1) {
return word;
} else {
mid = word.length/2;
return expand(word.substr(0,mid)) + " --- " + expand(word.substr(mid,word.length));
}
}
document.write(expand("anna"));