2013-05-18 7 views
3

Хорошо, я получаю, что вся рекурсия более функциональна, потому что вы не изменяете состояние какого-либо объекта на итерации. Однако ничто не мешает вам сделать это в scala.Scala recursion no побочные эффекты

var magoo = 7; 

    def mergeSort(xs: List[Int]): List[Int] = { 
    ... 
    magoo = magoo + 1 
    mergeSort(xs1, xs2); 

    } 

Фактически, вы можете сделать рекурсию так же, как и в Scala, как можно на Java. Так справедливо ли говорить, что Scala просто упрощает запись краткой рекурсии, используя сопоставление шаблонов? Как нет ничего, что мешает мне писать любой код рекурсии без гражданства на Java, который я могу написать в Scala?

Дело в том, что в Scala сложная рекурсия может быть достигнута с помощью более чистого кода. Вот и все. Правильно?

ответ

4

Если вы можете сделать сложную рекурсию на Java, Вы можете сделать сложную рекурсию на ассемблере, если хотите. Но в Скале это проще сделать. Также у Scala есть оптимизация хвостовых вызовов, что очень важно, если вы хотите написать любой произвольный итеративный алгоритм как рекурсивный метод, не получая переполнение стека или падение производительности.

5

Существует что-то, что остановит вас от написания кода рекурсии в Java: устранение хвостового вызова (TCE). В Java можно получить исключение StackOverflowException при глубокой рекурсии, тогда как in Scala tail calls will be optimized (внутренне представлено как циклы).

Так справедливо сказать, что Scala просто упрощает запись краткой репликации с использованием сопоставления с образцом?

Я думаю, что в Scala эти два понятия ортогональны друг другу.

2

Немногие языки программирования фактически запрещают вам писать неизменяемый код. Фактически, реальный чистый функциональный язык может быть просто Haskell, и даже Scheme и ML имеют некоторый способ использования изменяемой ценности. Итак, функциональный стиль просто поощряйте вам написать неизменный код. Это зависит от вас самих, чтобы выбрать, изменять ли значение или нет.

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