【问题标题】:Scala Nested Functions/High-Order FunctionsScala 嵌套函数/高阶函数
【发布时间】:2015-10-02 00:34:41
【问题描述】:

我是 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)

【问题讨论】:

  • 这是为了上课吗?这里有一些提示: 在golden() 中,fib 参数的类型是“Int => Int”,这是一个接受整数并产生整数的函数,它与您的fib() 方法的类型相匹配。这意味着您将把 fib 方法作为参数传递给 golden()。 Golden() 可以在内部使用这个 fib 函数,并且需要循环直到找到足够精确的估计。
  • 我将如何计算 phi?我肯定需要重写 fib 吗?
  • 你不需要重写fib。你只需要使用fib。例如,phi1 = fib(10) / fib(9) 是 phi 的近似值。 phi2 = fib(11) / fib(10) 是一个更好的 phi 近似值。由您决定需要多少次 fib 迭代才能获得所需的精度。
  • def golden(fib: Int => Int, n: Int): Double = { return fib(n) / fib(n-1) } 一件事;我该如何测试?当我尝试像以前一样使用该功能时,我不断收到类型错误。基本上我得到 type (Int) => Int expected, actual: Int
  • 代码中的一些具体的 cmets:在第一个 fib 函数中,我认为您的意思是 if,而不是 while。而普通的 Scala 代码几乎从不使用return,所以你应该删除所有对它的使用。

标签: scala function nested fibonacci


【解决方案1】:
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)

【讨论】:

  • edit 提供更多信息。纯代码和“试试这个”的答案是discouraged,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
  • Thomas 这还不是您屏幕截图中显示的问题的正确解决方案,尽管我对给您似乎是您的家庭作业的答案感到不妥。提醒一下,您正试图在给定的精度位数内产生近似值。 n 参数应该代表这个精度,而不是斐波那契迭代次数。
  • 对不起,我现在意识到了这一点。感到非常困惑,并假设他的意思是精度,因为随着 n 的增加,phi 的精度更高。相反,正如您所说,这将是一个更好的近似值。如果他使用了“n”以外的其他东西,我可能会抓住它。 :/ 会更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
相关资源
最近更新 更多