【发布时间】:2011-03-01 15:39:24
【问题描述】:
我正在学习 Scala 作为我的第一个函数式语言。作为问题之一,我试图找到一种生成序列 S 最多 n 个位置的功能方法。定义 S 使得 S(1) = 1,并且 S(x) = x 在序列中出现的次数。 (我不记得这叫什么了,但我以前在编程书籍中看到过。)
实际上,序列如下所示:
S = 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7 ...
我可以很容易地在 Scala 中使用这样的命令式样式生成这个序列:
def genSequence(numItems: Int) = {
require(numItems > 0, "numItems must be >= 1")
var list: List[Int] = List(1)
var seq_no = 2
var no = 2
var no_nos = 0
var num_made = 1
while(num_made < numItems) {
if(no_nos < seq_no) {
list = list :+ no
no_nos += 1
num_made += 1
} else if(no % 2 == 0) {
no += 1
no_nos = 0
} else {
no += 1
seq_no += 1
no_nos = 0
}
}
list
}
但我真的不知道如何在不使用 vars 和 while 循环的情况下编写此代码。
谢谢!
【问题讨论】:
-
我只读了一点关于 Scala 的文章,但是这样的内容应该可以帮助您入门:
Stream.continually(x).take(S(x)).toList。使用 this 作为其定义的一部分编写一个递归函数 - 我只是不太了解 Scala,无法告诉你它应该是什么。 -
你确定这个序列是唯一的吗?我认为
1, 0, 0, 0, ...也符合您的条件。 -
似乎是哥伦布的序列:oeis.org/A001462
标签: scala functional-programming