Скольжения () на коллекции в Scala

Возможный дубликат:
Непоследовательное поведение для xs.sliding(n), если n меньше размера?

РЕДАКТИРОВАТЬ: я понимаю, что поведение, описанное здесь, является ожидаемым поведением скольжения; Я спрашиваю, почему это так.

РЕДАКТИРОВАТЬ 2: дубликат этого вопроса

Я использую функцию скольжения в коллекции Scala, и меня удивляет поведение в следующем случае:

скольжение ( N)

где М - это m.size, а М

В этом случае вы не возвращаете пустой итератор, вы возвращаете одноэлементный итератор, где единственным элементом является вход:

scala> List( ).sliding( 2 ).size
res0: Int = 0
scala> List( 1 ).sliding( 2 ).size
res1: Int = 1

Например, вот простая функция для рекурсивного вычисления строки из треугольника Паскаля:

def row( num : Int ) : List[ Int ] =
{
    num match
    {
        case 0 => List( 1 )
        case x : Int => List( 1 ) ++ row( x - 1 ).sliding( 2 ).map( _.sum ) :+ 1
    }
}

но это не так, как ожидалось, из-за поведения, описанного выше:

scala> row( 1 )
res0: List[Int] = List(1, 1, 1)

Вместо этого мы должны включить дополнительный особый случай:

def row2( num : Int ) : List[ Int ] =
{
    num match
    {
        case 0 => List( 1 )
        case 1 => List( 1, 1 )
        case x : Int => List( 1 ) ++ row2( x - 1 ).sliding( 2 ).map( _.sum ) :+ 1
    }
}

и теперь это работает, как ожидалось.

Кто-нибудь знает, почему скольжение ведет себя так? Мне кажется странным, что я запрашиваю вложенные коллекции определенной длины, и в случае, рассмотренном здесь, вы получаете одну коллекцию другой длины!

0 ответов

Другие вопросы по тегам