2011-02-01 18 views
8

मैं एक कमजोर सीएस पृष्ठभूमि के साथ एक सुंदर अनुभवी फ्रंटेंड इंजीनियर हूं। मैं रिकर्सन की अवधारणा के आसपास अपना सिर लेने की कोशिश कर रहा हूं। अधिकांश उदाहरण और स्पष्ट स्पष्टीकरण जो मैं पा सकते हैं, वे इसे समझने में आसान तरीके से इसे समझा नहीं रहे हैं।जावास्क्रिप्ट में रिकर्सिव स्ट्रिंग रिवर्सल फ़ंक्शन?

मैंने खुद को एक ऐसा फ़ंक्शन लिखने का कार्य निर्धारित किया जो एक स्ट्रिंग को दोबारा उलट देगा। मुझे पता है कि मूल स्थिति होनी चाहिए (यानी समाधान मिल गया है), लेकिन मैं यह नहीं समझ सकता कि वास्तव में ऐसा कुछ कैसे लिखना है और अध्ययन के लिए डेमो का उपयोग कर सकता है।

कोई नमूना समारोह प्रदान कर सकता है?

उत्तर

19

कुछ की तरह:

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

तो समारोह पुनरावर्ती के रूप में वह खुद को कॉल काम करने के लिए है। बस के लिए kicks (भले ही जावास्क्रिप्ट पूंछ कॉल उन्मूलन प्रदर्शन नहीं करता) के लिए

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)) 
    } 
} 
+0

के रूप में यह हो जाता है सरल। – maerics

+0

धन्यवाद। मेरे लिए यह समझना वास्तव में आसान है। मैं अगली कोशिश कर रहा हूं कि मैं मैन्युअल रूप से एक सरणी को मैन्युअल रूप से उलट कर सकता हूं या नहीं। – Geuis

+0

सरणी संस्करण बहुत अधिक कठिन होगा क्योंकि ईसीएमएस्क्रिप्ट (जिसमें जावास्क्रिप्ट एक कार्यान्वयन है) में सरणी पूरी तरह से अनिवार्य हैं ... – maerics

-1

यह आपके द्वारा पूछे गए एल्गोरिदम का एक बहुत सीधा सी # कार्यान्वयन है। मुझे लगता है कि इसे जावास्क्रिप्ट में आसानी से लिखा जा सकता है।

/* 
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(); 
    } 
} 
-1

इस प्रयास करें

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

एक पूंछ पुनरावर्ती संस्करण,:

+0

आपका क्या मतलब है * भले ही जावास्क्रिप्ट अनुकूलित नहीं करता *? – KooiInc

+0

कई कंपाइलर्स/दुभाषिया प्रदर्शन करते हैं [पूंछ कॉल उन्मूलन] (http://en.wikipedia.org/wiki/Tail_call) (कुछ भाषा चश्मा भी इसकी आवश्यकता होती है) जो पूंछ-पुनरावर्ती कार्यों को उनके पुनरावर्तक समकक्षों के साथ तुलनात्मक रूप से निष्पादित करता है। ईसीएमएस्क्रिप्ट विनिर्देश की ऐसी कोई आवश्यकता नहीं है और जहां तक ​​मुझे पता है, कोई मौजूदा जावास्क्रिप्ट दुभाषिया ऐसा नहीं करता है। ES6 spec में – maerics

+1

, पूंछ कॉल अब ठीक तरह से व्याख्या की गई हैं। – steviejay

-1

यह वर्बोज़ है, लेकिन मैं बनाने पसंद यह आसान तार्किक चरणों में समझने के लिए:

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); 
-1

अब तक सबसे अच्छा मुझे लगता है कि:

त्रिगुट ऑपरेटर का उपयोग करके आप आसानी से इसे उल्टा कर सकते हैं कोड की
function reverse(s) { 
    if (s.length===1) return s; 
    return reverse(s.slice(1)) + s[0]; 
} 
0

एक पंक्ति।

स्पष्टीकरण: यदि स्ट्रिंग मौजूद है (यदि शून्य नहीं है) तो रिकर्सन लौटाएं अन्यथा रिकर्सन को रोक दें।

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

समारोह कॉल:

console.log(reverseString('hello')); 
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");

संबंधित मुद्दे