2014-12-11 2 views
4

Я попытался рекурсивное изменение строки ниже:JavaScript рекурсии обратная строка

function reverse(str){ 
    var results =[]; 
    var j =0; 
    if(str.length === 0){ 
     console.log('this is zero, yo'); 
     return results.join(''); 
    } 

    results[j] = str[str.length -1]; 
    console.log('results: ' + results); 
    j++; 
    var next = str.substring(0,str.length -1); 
    console.log(next); 
    return reverse(next); 
} 
try{ 
    console.log('***'); 
    console.log(reverse('testing')); 
} 
catch(e){ 
    console.log('blew the stack'); 
} 

, к сожалению, результаты создается в пустой строке в последний раз при запуске функции. Должен ли я создать внутреннюю функцию, которая возвращает results, поэтому она не установлена ​​в пустую строку? Является ли этот код закрытым?

редактировать: это ради любопытства, я пытаюсь не использовать функции, которые делают его очень легко (обратный())

+0

Я не получить то, что вы хотите сделать с этим 'results' массива. Попытайтесь написать код без каких-либо массивов, только используя нарезку и конкатенацию скринов. – Bergi

+0

Я изначально сделал это, используя цикл while. но я узнаю, что я не могу объявлять переменные в рекурсивных функциях, как обычные. – Rico

+0

Ну, вы можете * сделать это с помощью внутренней функции - объявить «результаты» вне фактической рекурсивной функции, которая займет часть цикла while (и recurse over 'j'); но я думаю, что это не вопрос вашего упражнения. – Bergi

ответ

3

Проблема в коде является то, что вы пропускаете последний символ каждый и возвращает пустую строку в последнем рекурсивном вызове.

Вместо этого, получите последний символ строки и добавьте обратное значение остальной части строки.

Вы можете реализовать его, как этот

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

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

Здесь reverse("abc") будет оцениваться как этот

"c" + reverse("ab") 
"c" + ("b" + reverse("a")) 
"c" + ("b" + ("a" + reverse("")))  // Hits the `base condition` of recursion 
"c" + ("b" + ("a" + ""))    // Unwinding begins here 
"c" + ("ba") 
"cba" 
+1

Или, гораздо проще, сделать 'reverse (str.slice (1)) + str [0]' :-) – Bergi

+0

@Bergi Конечно, но я подумал, что было бы легче понять его, если бы я использовал конструкции из его оригинальный код :) – thefourtheye

Смежные вопросы