Как сделать рекурсивные циклы в скале - PullRequest
6 голосов
/ 12 ноября 2011

Мне было интересно, есть ли лучший способ написания рекурсивных циклов в scala.

def fib(n: Int) = {
  def loop(a: BigInt = 0, b: BigInt = 1, n: Int = n): BigInt = {
    if(n==0) a
    else loop(b, a+b, n-1)
  }
  loop()
}

Я мог бы написать это так

def fib(n: Int, a: BigInt = 0, b: BigInt = 1): BigInt = {
  if(n==0) a
  else fib(n-1, b, a+b)
}

но тогда a и b будут выставлены и больше не будут заключены внутри метода.

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

Обратите внимание, что вы часто можете использовать foldLeft или foldRight в таких ситуациях:

def fib(n: Int) = (1 to n).foldLeft((BigInt(0),BigInt(1)))((p,_)=>(p._2,p._1+p._2))._1

[Изменить]

Другим подходом было бы решение на основе итераторов:

def fib = Iterator.iterate((0,1)){case (x,y) => (y,x+y)}.map(_._1)

Это генерирует бесконечное количество чисел Фибоначчи, но вы можете просто взять из них столько, сколько хотите, например, fib.take(10).toList

1 голос
/ 12 ноября 2011

Петли имеют свои собственные области применения.Когда вы заменяете цикл рекурсивной функцией, вы вынуждены создавать явный контекст (внутренний метод).Обойти это невозможно.Вот как это делается.В этом нет ничего плохого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...