逐行显示递归

display the recursion line by line

本文关键字:递归 显示 逐行      更新时间:2023-09-26

我正在尝试在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"));