Scala 嵌套 Functions/High-Order 函数
Scala Nested Functions/High-Order Functions
我是 Scala 的新手,最近刚刚了解到函数在该语言中的工作原理。
我正在尝试使用斐波那契函数计算 phi。这两个斐波那契函数很容易编写(一个是递归的,一个是尾递归的),但我完全不知道如何继续。
根据我的理解,golden 函数会使用函数 fib 的结果作为参数,然后使用整数 n 来确定精度。然而,尽管现在研究了一段时间,但我完全不知道如何实现这一目标。
我肯定需要使用单独的F1和F2参数来计算phi?那么我是否应该向我的 fib 函数添加更多变量来这样做并在斐波那契计算期间进行计算?
除此之外,我如何将精度强制为 x 位数?
以下是我到目前为止的屏幕截图,如果您能提供任何帮助,我将不胜感激。我真的很难开始推进这件事。
http://i.imgur.com/Oms9IhK.png
// Fibonacci Sequence 1
def fib(n: Int): Int = {
while(n-1 > 0){
return fib(n - 1) + fib(n - 2)
}
return n
}
fib(40)
assert(fib(40) == 102334155, "Wrong result for fib1(40)!")
// Fibonacci Sequence 2
def fib2(n: Int): Int = {
def tailrec(f1: Int, f2: Int, n: Int): Int = {
if(n != 1) {
tailrec(f2, f2 + f1, n-1)
}
else {
return f2
}
}
return tailrec(0, 1, n)
}
fib2(40)
assert(fib2(40) == 102334155, "Wrong result for fib1(40)!")
// Write a function that returns the φ value with at least n digits of precision
def golden(fib: Int => Int, n: Int): Double = {
return (fib(n) / fib(n+1))
}
golden(fib(_), 40)
def golden(fib: Int => Int, n: Int): Double = {
def goldenCal(n: Int): Double = fib(n + 1).toDouble / fib(n).toDouble
def isGoodEn(n: Int, precision: Int): Boolean = Math.abs(goldenCal(n) - goldenCal(n + 1)) < (Math.pow(10, -(precision + 1)))
def goldenIter(n: Int, precision: Int): Double = {
if (isGoodEn(n, precision))
goldenCal(n + 1)
else
//calculate the golden number using fib1
goldenIter(n + 1, precision)
}
goldenIter(n, 3)
}
def golden1(n:Int):Double = golden(fib1,n)
golden1(9)
def golden2(n:Int):Double = golden(fib1,n)
golden1(5)
我是 Scala 的新手,最近刚刚了解到函数在该语言中的工作原理。
我正在尝试使用斐波那契函数计算 phi。这两个斐波那契函数很容易编写(一个是递归的,一个是尾递归的),但我完全不知道如何继续。
根据我的理解,golden 函数会使用函数 fib 的结果作为参数,然后使用整数 n 来确定精度。然而,尽管现在研究了一段时间,但我完全不知道如何实现这一目标。
我肯定需要使用单独的F1和F2参数来计算phi?那么我是否应该向我的 fib 函数添加更多变量来这样做并在斐波那契计算期间进行计算?
除此之外,我如何将精度强制为 x 位数?
以下是我到目前为止的屏幕截图,如果您能提供任何帮助,我将不胜感激。我真的很难开始推进这件事。
http://i.imgur.com/Oms9IhK.png
// Fibonacci Sequence 1
def fib(n: Int): Int = {
while(n-1 > 0){
return fib(n - 1) + fib(n - 2)
}
return n
}
fib(40)
assert(fib(40) == 102334155, "Wrong result for fib1(40)!")
// Fibonacci Sequence 2
def fib2(n: Int): Int = {
def tailrec(f1: Int, f2: Int, n: Int): Int = {
if(n != 1) {
tailrec(f2, f2 + f1, n-1)
}
else {
return f2
}
}
return tailrec(0, 1, n)
}
fib2(40)
assert(fib2(40) == 102334155, "Wrong result for fib1(40)!")
// Write a function that returns the φ value with at least n digits of precision
def golden(fib: Int => Int, n: Int): Double = {
return (fib(n) / fib(n+1))
}
golden(fib(_), 40)
def golden(fib: Int => Int, n: Int): Double = {
def goldenCal(n: Int): Double = fib(n + 1).toDouble / fib(n).toDouble
def isGoodEn(n: Int, precision: Int): Boolean = Math.abs(goldenCal(n) - goldenCal(n + 1)) < (Math.pow(10, -(precision + 1)))
def goldenIter(n: Int, precision: Int): Double = {
if (isGoodEn(n, precision))
goldenCal(n + 1)
else
//calculate the golden number using fib1
goldenIter(n + 1, precision)
}
goldenIter(n, 3)
}
def golden1(n:Int):Double = golden(fib1,n)
golden1(9)
def golden2(n:Int):Double = golden(fib1,n)
golden1(5)