2016-08-29 6 views
1

Я был в кодевом утром, и есть эта Kata с просьбой о функции, чтобы изменить строку, переданную как параметр, методом рекурсии.Пожалуйста, объясните эту рекурсивную функцию javascript

Лучшим решением, перечисленным для этой проблемы, было это.

function reverse(str) { 
    return str.length > 1 ? reverse(str.slice(1)) + str[0] : str; 
} 

Я исследовал для этого все это утро, и я до сих пор не знаю, что происходит здесь:

+ str[0] 

Может кто-нибудь пожалуйста, разъяснить это для меня?

+0

Я полагаю, что «лучшее решение» означает лучшее рекурсивное решение?Я сомневаюсь, что это эффективный способ изменить строку. –

+0

Это плохое решение, поскольку рекурсивный вызов не находится в положении хвоста. Попробуйте преобразовать функцию в хвостовую рекурсивную версию, чтобы лучше понять предмет. Подсказка: стиль прохождения аккумулятора. – ftor

ответ

2

Суть функции заключается в следующем:

  1. Возьмите подстроку из второго символа к последним
  2. Применить обратную функцию рекурсивно
  3. Возьмите первый символ и добавить его в конце в результате рекурсивного вызова
  4. Возвращает результат

Это приводит к следующей логике, вызовы (рекурсивное) функции, указанные в скобках:

(A B C D E) 
((B C D E) A) 
(((C D E) B) A) 
((((D E) C) B) A) 
(((((E) D) C) B) A) 
+0

Спасибо, сейчас имеет смысл! – notforever

1

str.slice(1) «отрубает» первая буква строки и возвращает остальное. Итак 'abcd'.slice(1) дает вам 'bcd'.

str[0] - первая буква строки. 'abcd'[0] - 'a'.

Итак, str.slice(1) + str[0] берет первую букву строки и «перемещает» ее до конца: 'abcd' становится 'bcda'.

Это не касается рекурсивного решения, но оно отвечает на ваш вопрос о + str[0].

0

Оператор + является конкатенатором для строки. Вы можете использовать вместо этого CONCAT это:

var reverse = str => str.length > 1 ? reverse(str.slice(1)).concat(str[0]) : str; 
console.log(reverse("123456789")); // 987654321 
1

Попробую переписать функцию в более «читабельной» способом

reverse = str => { 

    // If there is still string to reverse 
    if (str.length > 1) { 
     let firstChar = str[0] 
     let strWithoutFirstChar = str.slice(1) 

     // Notice only a part of the string 'comes back' here 
     // console.log(strWithoutFirstChar) // Might help 
     return reverse(strWithoutFirstChar) + firstChar 
    } 

    // Else return result as is 
    else { 
     return str 
    } 

} 

Это та же функция, но без триад и объявления так называемые переменные.

Если вы раскомментировать console.log() линии и называют:

reverse('help'); 

Вывода должен быть:

elp 
lp 
p 
'pleh' 

Надеется, что это помогает!

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