逐行显示递归

时间:2014-11-17 09:36:56

标签: javascript recursion

我正在尝试在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论坛),请指导我在哪里发布。

6 个答案:

答案 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"));