使用scala学习函数式编程。偶然发现了这个练习。
编写一个递归函数来获得第n个斐波那契数(http://mng.bz/C29s)。前两个Fibonacci数字是0和1。第n个数字始终是前两个数字的总和-序列从0,1,1,2,3,5开始。您的定义应该使用局部尾递归函数。
def fib(n: Int): Int我的答案计算n+1值并返回第n个。谁能给我展示一个不计算额外n+1th值的更好的实现?
object patterns {
def fib(n : Int): Int = {
@annotation.tailrec
def go(n: Int, prev2: Int, prev: Int): Int =
if(n<=0) prev2
else go(n-1, prev, prev2+prev)
go(n, 0, 1)
}
}如果有人感兴趣,这是来自Chiusano和Bjarnason的书“在scala中的函数式编程”。练习2.1期待您的回复。
发布于 2015-02-13 16:54:57
我认为:
def fib2(n: Int): Int = {
if (n < 1) 0
else if (n < 2) 1
else {
@annotation.tailrec
def go(i: Int, prev2: Int, prev: Int): Int =
if (i == n) prev
else go(i + 1, prev, prev2 + prev)
go(2, 1, 1)
}
}或者使用ByName参数:
def fib3(n: Int): Int = {
@annotation.tailrec
def go(n: Int, prev2: Int, prev: => Int): Int =
// ^ ByName
if (n <= 0) prev2
else {
val p = prev
go(n - 1, p, prev2 + p)
}
go(n, 0, 1)
}发布于 2015-02-13 17:38:36
我喜欢使用stream来实现它。因为代码更短,更容易理解。
def fibo():Stream[Int] = {
def addRec(o1:Int,o2:Int):Stream[Int] = {
o1 #:: addRec(o2,o1 + o2)
}
addRec(1,1)
}
println(fibo().take(100).toList) 调用fibo.drop(n-1)(0)很容易获取nth
https://stackoverflow.com/questions/28492880
复制相似问题