【发布时间】:2011-01-18 22:58:36
【问题描述】:
我是函数式编程的新手。我刚刚尝试解决以下问题:
[ a rough specification ]
e.g.1:
dividend : {3,5,9}
divisor : {2,2}
radix = 10
ans (remainder) : {7}
Procedure :
dividend = 3*10^2+5*10^1+9*10^0 = 359
similarly, divisor = 22
so 359 % 22 = 7
e.g.2:
dividend : {555,555,555,555,555,555,555,555,555,555}
divisor: {112,112,112,112,112,112,112,112,112,112}
radix = 1000
ans (remainder) : {107,107,107,107,107,107,107,107,107,107}
我对这个问题的解决方案是:
object Tornedo {
def main(args: Array[String]) {
val radix: BigInt = 1000
def buildNum(segs: BigInt*) = (BigInt(0) /: segs.toList) { _ * radix + _ }
val dividend = buildNum(555,555,555,555,555,555,555,555,555,555)
val divisor = buildNum(112,112,112,112,112,112,112,112,112,112)
var remainder = dividend % divisor
var rem = List[BigInt]()
while(remainder > 0) {
rem = (remainder % radix) :: rem
remainder /= radix
}
println(rem)
}
}
虽然我对这段代码很满意,但我想知道如何消除 while 循环和两个可变变量,让这段代码更实用。
任何帮助将不胜感激。
谢谢。 :)
【问题讨论】:
-
我不熟悉 scala,所以我无法调整您的代码。为了将其转换为更接近功能样式,while 循环可能应该转换为尾递归函数。当然,如果 scala 没有尾调用优化,那么该解决方案是值得商榷的。
-
可以用
unfold函数解决,但Scala 没有。也许 Scalaz 会。 -
@Daniel:你能把这个解决方案贴在这里吗?
标签: scala refactoring functional-programming