2014-07-26 2 views
-1

응용 프로그램의 목적은 다수의 순서를 표시하고 사용자가 여섯 번째 자리 선택할 수 있습니다 this Q&A 비록여섯 번째 자리를 반환하는이 스칼라 피보나치 코드를 어떻게 단순화 하시겠습니까?

1 2 3 5 8 ...

이 확인되었습니다, 또 다른 코드는 요구 사항을 충족하기 위해 생성했다 숫자 시퀀스의 여섯 번째 자리를 반환합니다. 시험

import org.scalatest.FunSuite 
import org.scalatest.FunSpec 
import org.scalatest.matchers.ShouldMatchers 

class CalculationTest extends FunSuite { 
    test("fibonacci") { 
    assert(calculation.fibonacci(1, 2) === 13) 
    } 
} 

메인

object Calculation { 
    def fibonacci(a: Int, b: Int) : Int = { 
    var first:Int = a 
    var second:Int = b 
    var third:Int = 0 
    var fourth:Int = 0 
    var fifth:Int = 0 
    var sixth:Int = 0 

    third = first + second 
    fourth = second + third 
    fifth = third + fourth 
    sixth = fourth + fifth 

    return sixth 
    } 
} 

가 가능한 메인 코드를 단순화하기 위해, 예를 들어가요 각각의 자릿수를 계산하는 대신 여섯 번째 자릿수를 반환하는 것입니까?

+0

나는 당신의 질문이 무엇인지 확실하지 않다. 표준 fibonnacci 시퀀스 또는 다양한 시퀀스를 계산하는 무언가를 원하십니까? 시퀀스를 계산하는 코드를 단순화하려고하십니까? – DNA

+0

질문이 업데이트되었습니다. – 030

+2

함수에 동일한 args를 전달할 수 있다면 왜 클래스가 필요합니까? 자바에 의해 세뇌? –

답변

4

시퀀스를 int의 무한 게으른 스트림으로 정의 할 수 있습니다. 요청 때까지 계산되지 않습니다 :

scala> lazy val fibs: Stream[Int] = 1 #:: fibs.scanLeft(2)(_+_) 
fibs: Stream[Int] = <lazy> 

은 당신은 단지 첫 6 개 항목의 계산을 강제 단지 6 항목을 요청할 수 있습니다 :

scala> fibs(5) 
res0: Int = 13 

하거나 요청할 수 있습니다 6 첫째 :

scala> fibs.take(6) 
res1: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

하지만 여전히 게으른 행동주의, 당신이 그들을 강제로 계산한다 :

scala> fibs.take(6).force 
res2: scala.collection.immutable.Stream[Int] = Stream(1, 2, 3, 5, 8, 13) 

하거나 목록에서 결과를 얻을 :

scala> fibs.take(6).toList 
res3: List[Int] = List(1, 2, 3, 5, 8, 13) 
2

많은 노력 없이도 코드를 줄일 수 있습니다. 그래도 여전히 나에게 많은 의미를주지는 않습니다. 중요한 점 : 당신은 전혀 병을 필요로하지 않는다.

class Calculation(val a: Int, val b: Int) { 
    def fibonacci() : Int = { 
    val third = a + b 
    val fourth = b + third 
    val fifth = third + fourth 
    fourth + fifth 
    } 
} 
+0

어떻게 수업을 줄이지 않습니까? –

0

내가 가장 일반적인 접근 방식에 갈 것 :

class Calculation(private var a : Int, private var b : Int) { 
    private def fibCalc(n : Int) : Int = 
    if(n == 0) a 
    else if(n == 1) b 
    else if(n > 1) fibCalc(n-1) + fibCalc(n-2) 

    def fibonacci = fibCalc(6) 
} 

이 어떤 임의의 n 훨씬 쉽게 작업의 n 번째로 6에서 변경합니다. (표준 재귀 해법은 분명히 n = 6에 대해서는 중요하지 않지만 분명히 최적이 아닙니다. 행렬 지수 구현과 같은 다른 방법을 시도해 볼 수 있습니다).

관련 문제