逐行显示递归
display the recursion line by line
我正在尝试在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
我似乎无法连接头部来做第一个例子。
我的 expand 的 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论坛),请指导我在哪里发布它。
这是我
的疯狂尝试
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")]) );
这就是你需要的
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('')
}
正如我所说,在使用递归时不可能显示递归的"过程"步骤,这里有一个解决方法,它将输出您想要的步骤:
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('---'));
}
要查看我所做的最好的所有步骤,是:
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"));
您必须返回字符串的两个部分:
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,并在每个循环中将新输出连接到它。
它应该可以解决问题。
希望问题出在你的第一部分。根据您的算法,您将字符串 anna 分成两部分,
安和纳
因此,您需要扩展两个部分,直到零件长度小于或等于 1。 所以你所需要的函数是下面的。
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"));
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 有没有一种方法可以在Javascript中进行可变递归currying
- 如何对不同的表递归使用以下代码
- 将jQuery对象传递到setTimeout递归函数中
- 递归显示n元树
- 以递归方式设置“显示:无”,但在特定元素内除外
- 逐行显示递归
- 使用 Ng-Repeat 以递归方式显示数据
- 如何显示在递归函数中添加了哪些变量
- Console.log显示对象,但递归调用函数时得到错误