この問題は答えを出すだけなら手計算レベルです。階乗で割っていって余りを求めるだけです。ただ、関数型らしく書いたらややこしくなってしまったので、var使いまくりで書いてみました。
def factorial(n :Int) = (1 to n).foldLeft(1)(_ * _) def pop(a :List[Int], k:Int) :(Int,List[Int]) = if(k == 0) (a.head, a.tail) else { val (m, xs) = pop(a.tail, k - 1) (m, a.head :: xs) } class IterDigits(N :Int) extends Iterator[Int] { var r = N - 1 var n = 9 var a = List.range(0, 10) def hasNext() = n >= 0 def next() = { val f = factorial(n) val k = r / f r = r % f val (m, b) = pop(a, k) a = b n -= 1 m } } val N = 1e6.toInt println ((new IterDigits(N)).foldLeft(0L)(_ * 10 + _))