[Scala] Lista de construção do valor máximo atual.

Problema Original

Eu fiz um curso chamado Princípios de Programação de Função em Scala no Coursera . Na tarefa da semana 3 (TweetSet), somos solicitados a
implementar um método que possa construir uma lista decrescente usando uma função que retorna o
valor máximo atual no conjunto.

Como uso a função recursiva para construir a lista no Scala com muita frequência, acabei descobrindo que alguns códigos do Scala se parecem com o seguinte:

var mySet = Set(3, 4, 1, 6, 5)

def buildingList(resetSet: Set[Int]): List[Int] = {
def building(resetSet: Set[Int], accumulator: List[Int]): List[Int] = {
if (resetSet.isEmpty) {
accumulator

} else {
var max = resetSet.max
building
(resetSet - max, max :: accumulator)
}
}
building
(resetSet, Nil)
}

assert(buildingList(mySet) == List(6, 5, 4, 3, 1)) // Ooops!

Claro, não é bem isso que queremos. Uma vez que a lista na atribuição suporta apenas a operação prefixar para adicionar um elemento à lista, se usarmos esse padrão, também obteremos uma lista crescente.

Problema convertido

Parece um pouco bobo agora, mas eu realmente não tenho ideia de como escrever essa função no início.

Mas de repente eu descobri que este é EXATAMENTE o mesmo problema descrito abaixo, se você pudesse resolver o seguinte problema (que muitas vezes é a primeira função recursiva que você verá em qualquer curso de programação), você deve ser capaz de construir uma lista com a mesma ordem como a ordem de entrada.

Define a recursive function (without inner function / helper function or accumulator), which returns the factorial of n.

def factorial(n: Int): Int = { .... }

In other words, `factorial(6)` should return `6 * 5 * 4 * 3 * 2 * 1`, where the most important thing is that `2 * 1` should be the first expression that really reduce to an integer value except of integer literal.

A solução do problema deve estar nos primeiros vídeos de aula, se realmente entendermos esse problema, descobriremos que são o mesmo problema. Basta fazer a seguinte substituição:

  1. factorial(n: Int): Int será buildingList(n: Set[Int]): List[Int]
  2. A condição de parada de factorialé n == 1, mas a condição de parada em buildingList deve ser num conjunto vazio.

Então, nos perguntamos a seguinte:

  1. Quando atingimos a condição de parada (n == 1)em factorial, retornamos o valor 1. O que devemos retornar se atingirmos a condição de parada em buildlingList?
  2. Usamos *operador para conectar todos os valores inteiros, que operador / função ou construção devemos usar para conectar todos os valores inteiros em buildingList?

Devido ao código de honra desta classe, não consigo colar o código Scala completo. Mas acho que essa dica é bastante clara de como devemos resolver esse problema.