2013-09-17 4 views
0

В нижней функции (запустите на листе Scala), почему я получаю вывод для суммы (ys)?Почему эти значения выводятся в этой рекурсивной функции?

Как вычисляются значения 0,1,0 и т. Д.?

def sum(xs: List[Int]): Int = xs match { 
    case Nil => 0 
    case y :: ys => { 
     println(sum(ys)) 
     y + sum(ys) 
    } 
    }            //> sum: (xs: List[Int])Int 

    sum(List(3,4,5,1))        //> 0 
                //| 1 
                //| 0 
                //| 6 
                //| 0 
                //| 1 
                //| 0 
                //| 10 
                //| 0 
                //| 1 
                //| 0 
                //| 6 
                //| 0 
                //| 1 
                //| 0 

ответ

2

Чтобы понять, что происходит, изменить свой случай заявление следующим образом:

case y :: ys => { 
    println("y: " + y + "\tys: " + ys + "\tsum(ys):" + sum(ys)) 
    y + sum(ys) 
} 

Вы получите этот результат:

scala> sum(List(3,4,5,1)) 
y: 1 ys: List()  sum(ys):0 
y: 5 ys: List(1)  sum(ys):1 
y: 1 ys: List()  sum(ys):0 
y: 4 ys: List(5,1) sum(ys):6 
y: 1 ys: List()  sum(ys):0 
y: 5 ys: List(1)  sum(ys):1 
y: 1 ys: List()  sum(ys):0 
y: 3 ys: List(4,5,1) sum(ys):10 
y: 1 ys: List()  sum(ys):0 
y: 5 ys: List(1)  sum(ys):1 
y: 1 ys: List()  sum(ys):0 
y: 4 ys: List(5,1) sum(ys):6 
y: 1 ys: List()  sum(ys):0 
y: 5 ys: List(1)  sum(ys):1 
y: 1 ys: List()  sum(ys):0 
res0: Int = 13 

Вы можете видеть, что нулевые элементы являются результатом вызова sum(ys) в пустом списке. Обратите внимание, что ваш результат равен 13.

// Assign the result to a val 
val result = sum(List(3,4,5,1)) 
Смежные вопросы