试图用scala编写斐波那契序列,我的代码哪里出错了?
我正在学习一门关于Udemy的课程来学习Spark,我对scala和递归编程是完全陌生的。当我在eclipse的.sc编辑器中尝试从这个循环中获取返回时,我没有得到正确的输出。如果有帮助的话,我可以提供更多的上下文试图用scala编写斐波那契序列,我的代码哪里出错了?,scala,Scala,我正在学习一门关于Udemy的课程来学习Spark,我对scala和递归编程是完全陌生的。当我在eclipse的.sc编辑器中尝试从这个循环中获取返回时,我没有得到正确的输出。如果有帮助的话,我可以提供更多的上下文 var prev2 = 0 var prev1 = 1 for (y <- 1 to 10){ var g : Int = prev1 + prev2 var prev2 : Int = prev1
var prev2 = 0
var prev1 = 1
for (y <- 1 to 10){
var g : Int = prev1 + prev2
var prev2 : Int = prev1
var prev1 : Int = g
println(g)
}
var prev2=0
var prev1=1
对于(y您声明了变量prev1
和prev2
两次。在{…}
之间的第二次声明隐藏了第一次声明,编译器认为在var g:Int=prev1+prev2
行中,您引用了以后声明的prev1
和prev2
。因此编译器编写了关于“正向参考”
修复代码的最简单方法是:
var prev2: Int = 0
var prev1: Int = 1
for (y <- 1 to 10){
var g : Int = prev1 + prev2
prev2 = prev1
prev1 = g
println(g)
}
var prev2:Int=0
变量prev1:Int=1
对于(y,只是为了让你知道…实际scala中的斐波那契看起来像这样:
lazy val fs: Stream[Long] = 0 #:: 1 #:: fs.zip(fs.tail).map { case(a,b) => a + b }
fs.take(11).map(println)
如果你打算使用vars和循环,scala是一种过分的技巧,有很多语言更适合这种风格。这段代码不编译。这里没有递归,这与递归编程有什么关系?@GregCarnovale如果你对我的答案满意,你可以接受它。你可以开始学习scalad函数式编程教程:,。这里列出了其他学习资源:,。或者类似的东西:0;::fs.scan(1L)(+)
yeah..没想到,它甚至更好。