Обратный список SCALA

Учитывая следующий код:

import scala.util.Random

object Reverser {

  // Fails for big list
  def reverseList[A](list : List[A]) : List[A] = {
    list match {
      case Nil => list
      case (x :: xs) => reverseList(xs) ::: List(x)
    }
  }

  // Works
  def reverseList2[A](list : List[A]) : List[A] = {
    def rlRec[A](result : List[A], list : List[A]) : List[A] = {
      list match {
        case Nil => result
        case (x :: xs) => { rlRec(x :: result, xs) }
      }
    }
    rlRec(Nil, list)
  }

  def main(args : Array[String]) : Unit = {
    val random = new Random
    val testList = (for (_ <- 1 to 2000000) yield (random.nextInt)).toList
    // val testListRev = reverseList(testList) <--- Fails
    val testListRev = reverseList2(testList)
    println(testList.head)
    println(testListRev.last)
  }
}

Почему первая версия функции не удалась (для больших входов), а второй вариант работает . Я подозреваю, что это что-то связанное с рекурсией хвоста, но я не очень уверен. Может кто-нибудь, пожалуйста, дайте мне «для чайников» объяснения?

19
задан Andrei Ciobanu 8 September 2011 в 09:07
поделиться