我是功能性编程的新手。我只是试图解决以下问题:如何让这段代码更实用?
[ 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循环&两个可变变量并使这个代码更加有用。
任何帮助将不胜感激。
谢谢。在斯卡拉2.8 :)
我不熟悉scala,所以我无法调整您的代码。为了将其更接近功能样式,可以将while循环转换为尾递归函数。当然,如果scala没有tail-call优化,那么这个解决方案是有争议的。 – nlucaroni 2010-02-19 21:16:09
它可以用'unfold'函数解决,但Scala没有。也许斯卡拉兹呢。 – 2010-02-20 15:03:33
@Daniel:你可以在这里发布解决方案吗? – missingfaktor 2010-02-20 16:08:13