Scala嵌套函数/高阶函数

时间:2015-10-02 00:34:42

标签: scala function nested fibonacci

我是Scala的新手,最近刚刚介绍了函数在该语言中的工作原理。

我试图用斐波纳契函数计算phi。两个斐波纳契函数很容易写(一个递归和一个尾递归),但我完全不知道如何继续。

从我的理解中,函数golden将使用函数fib的结果作为参数,然后使用整数n来确定精度。然而,尽管经过一段时间的研究,我仍然完全失去了如何实现这一目标。

我需要使用单独的F1和F2参数来计算phi吗?那么我应该在我的fib函数中添加更多变量来进行并在fibonacci计算期间进行计算吗?

除此之外,如何对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)

1 个答案:

答案 0 :(得分:0)

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
   [super drawMapRect:mapRect zoomScale:zoomScale inContext:context];
   CGContextSaveGState(context);
   CGContextSetBlendMode(context, kCGBlendModeMultiply);

   NSArray *polygons = ((IndexPolygonsMapOverlay *) self.overlay).polygons;
   @autoreleasepool {
        for (MYMKPolygonSubClass *poly in polygons) {
             if (!MKMapRectIntersectsRect(poly.boundingMapRect, mapRect)) {
                  continue;
             }
             if (!poly.color) continue;
             CGContextSaveGState(context);
             CGContextSetFillColorWithColor(context, poly.color.CGColor);

             CGContextMoveToPoint(context, (CGFloat) poly.points[0].x, (CGFloat) poly.points[0].y);
             for (int idx = 1; idx < poly.pointCount; idx ++) {
                  CGContextAddLineToPoint(context, (CGFloat) poly.points[idx].x, (CGFloat) poly.points[idx].y);
             }
             CGContextClosePath(context);
             CGContextDrawPath(context, kCGPathFill);
             CGContextRestoreGState(context);
        }
   }
   CGContextRestoreGState(context);
}