javascript中的递归字符串反转功能?

时间:2011-02-01 05:21:51

标签: javascript recursion

我是一位非常有经验的前端工程师,背景很弱。我试图理解递归的概念。我能找到的大多数例子和所谓的解释都没有以我容易理解的方式解释它。

我为自己编写了一个编写函数的任务,该函数将递归地反转字符串。我知道必须有一个基本条件(即找到解决方案),但我无法弄清楚如何实际编写这样的东西并且可以使用演示来学习。

有人可以提供样本功能吗?

12 个答案:

答案 0 :(得分:26)

类似的东西:

function reverse (str) {
    if (str === "") {
        return "";
    } else {
        return reverse(str.substr(1)) + str.charAt(0);
    }
}

因此,函数是递归的,因为它调用自己来完成工作。

答案 1 :(得分:3)

尾部递归版本,仅用于踢(即使JavaScript不执行尾部调用消除):

function reverse(str) {
  function r(s, acc) {
    return (s.length == 0) ? acc : r(s.substr(1), s.charAt(0) + acc);
  };
  return r(str, '');
};

答案 2 :(得分:0)

使用三元运算符的一行代码可以轻松地将其反转。

说明:如果string存在(如果不为null)则返回递归,否则停止递归。

  function reverseString(str) {
    return (str ? reverseString(str.substring(1)) + str.charAt(0) : str);
  }

函数调用:

console.log(reverseString('hello'));

答案 3 :(得分:0)

功能提升25%:jsperf.com



function Reverse(str) {
  if (str === null) {
    return null;
  }
  if (str.length <= 1) {
    return str;
  }
  var first = str[0];
  var last = str[str.length - 1];
  var str1 = Reverse(str.substring(1, str.length - 1));
  return last + str1 + first;
}

var result = Reverse("a really serious string of nothingness making call stack to explode");
&#13;
&#13;
&#13;

答案 4 :(得分:0)

function reverse(str) {
  if(str.charAt(0) === ''){
    return "";
  }
  return str.charAt(str.length -1) + reverse(str.substring(0,str.length-1));
}

答案 5 :(得分:0)

//以字符串作为参数调用此函数

function strrev(str) {
    return str.length !== 1 ? strrev(str.slice(1))+str[0] : str;
}

答案 6 :(得分:0)

根据MDN Web Docs,您应该使用substring()而不是substr()

  

警告:尽管String.prototype.substr(…)并未严格弃用(如“从Web标准中删除”),但它被视为旧版功能,应尽可能避免使用。它不是核心JavaScript语言的一部分,将来可能会删除。尽可能使用substring()方法。

此外,如果没有为charAt()提供索引作为参数,则默认值为0

因此,我们可以使用ternary operator并应用上述逻辑,编写一个递归的单线来反转字符串:

const reverse_string = s => s === '' ? '' : reverse_string(s.substring(1)) + s.charAt();

console.log(reverse_string('Hello, world!')); // !dlrow ,olleH

答案 7 :(得分:0)

我用于退出递归的基本情况是当长度减少到0时

在每个递归调用中,我们都将取出字符串的最后一个字符,并将其附加到从字符串的递归调用中得到的结果,随着使用slice删除最后一个字符,该字符串的大小会变小。

function reverse(str){
 if(str.length===0)
    return "";

return str[str.length-1]+reverse(str.slice(0,str.length-1));
}

答案 8 :(得分:-1)

试试这个:

function recurse(s) {  
  if (s.length == 0) {  
    return '' // stopping condition  
  } else {  // return last char + result of function called with chars up to last char  
    return s.substring(s.length, s.length -1) + recurse(s.substring(0, s.length -1))  
  }
}  

答案 9 :(得分:-1)

到目前为止,我认为最好:

function reverse(s) {
    if (s.length===1) return s;
    return reverse(s.slice(1)) + s[0];
}

答案 10 :(得分:-2)

这是您要求的算法的非常简单的C#实现。 我认为它可以很容易地用javascript重写。

/*
C#: The Complete Reference 
by Herbert Schildt 

Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/


// Display a string in reverse by using recursion. 

using System; 

class RevStr { 

  // Display a string backwards. 
  public void displayRev(string str) { 
    if(str.Length > 0)  
      displayRev(str.Substring(1, str.Length-1)); 
    else  
      return; 

    Console.Write(str[0]); 
  } 
} 

public class RevStrDemo { 
  public static void Main() {   
    string s = "this is a test"; 
    RevStr rsOb = new RevStr(); 

    Console.WriteLine("Original string: " + s); 

    Console.Write("Reversed string: "); 
    rsOb.displayRev(s); 

    Console.WriteLine(); 
  } 
}

答案 11 :(得分:-2)

这很冗长,但我喜欢以合理的步骤理解它:

function rev(soFar, count){
   console.log("asString: " + soFar );
   console.log("count: " + count);
   var len = soFar.length;
   var ret = soFar;//ret needs to be a reference to soFar
   if(len > count){
      var subd = soFar.substring(1,len);
      var first = soFar[0];
      //we want to inject the first letter at the index position one back from the length, minus what the count is at this point
      var indexOfInsert = len-1 - count;//so if count is 0 and length is 5, we want 4 (4 -0)
      var asArray = subd.split("");
      asArray.splice(indexOfInsert,0,first);
      count++;//need to increment count for the next round
      var asString = "";
    //recreate as string, not array - the default toString() makes this a comma delimited string. It is best toi just recreate it in a loop
    for(var i = 0; i<len; i++){
        asString+=asArray[i];
    }
    ret = rev(asString,count);//ret always needs to be reassigned
}
//only get here when count is greater than the length of the original string
return ret;//will always be a reference to soFar, which is being reassigned in the recursive loop

}

然后称之为:

var reversed = rev("Hello",0);
console.log("result",reversed);