2012-09-20 3 views
-1

배열의 가장 높은 요소를 인쇄하는 재귀 함수를 만들려고합니다.재귀 메서드가 작동하지 않습니다. 필요; ?

그것이 else maxi=xs.head 전에 ; 및 필요 말하는 } 내가 스칼라 세미 콜론을 사용하여 생각하지 않았다

, max(xs.tail) 후 당신이 그들을 사용하고 다른 기본 구문 규칙이 무엇을해야 할 때.

이 숙제처럼 보이는
var maxi = 0 
def max(xs: List[Int]): Int = {if (xs.isEmpty) throw new java.util.NoSuchElementException() 
     else if (xs.tail.isEmpty) maxi 
     else if (xs.tail.head > xs.head) maxi = xs.tail.head 
     max(xs.tail) 
     else maxi=xs.head 
     max(xs.tail) 
} 

답변

4

스칼라는 세미콜론을 사용하지만 줄 끝 부분에서는 선택 사항입니다. 즉, 줄 끝에서 세미콜론이 유효 할 경우 (즉, 줄이 표현식 중간에 끝나지 않으면 (예 : a +), 자동으로 하나가 삽입됩니다.

즉, 오류 메시지에도 불구하고 문제는 실제로 세미콜론과 관련이 없습니다. 문제는 if 또는 else 블록에서 표현식 이상을 사용하려는 경우 중괄호가 필요하다는 것입니다.

추 신 : 상태를 추적하기 위해 변경 불가능한 비 로컬 변수를 사용하는 것은 나쁜 의도이며 디자인을 여러 번 호출하면 (변수를 다시 설정하지 않고도) 문제가 발생할 수 있습니다.

PPS : xs.tail이 비어있을 때 수행 한 작업을 면밀히 검토해야합니다. 논리가 맞습니까?

7

, 나는 단지이 Odersky의 온라인 코 세라 코스의 첫 번째 숙제의 일부라는 사실에이를 근거로하고있다.

그렇지 않은 경우 알려주세요.하지만 가정합니다. 따라서 힌트를 드리겠습니다. if/else 분기가 어떻게 구성되어 있는지 살펴보십시오.

코스의 첫 번째 주 비디오는 스칼라의 세미콜론 유추를 다룹니다.

5

일부 형식이 올바른지 당신에게 문제가 표시됩니다 :

var maxi = 0 
def max(xs: List[Int]): Int = { 
    if (xs.isEmpty) 
    throw new java.util.NoSuchElementException() 
    else if(xs.tail.isEmpty) 
    maxi 
    else if(xs.tail.head > xs.head) { // <-- need this opening brace 
    maxi = xs.tail.head    // because there are two lines 
    max(xs.tail)     // in the body of the if-statement 
    }         // <-- and this closing brace 
    else { 
    maxi=xs.head 
    max(xs.tail) 
    } 
} 

세미 콜론은 스칼라 코드에서 유효합니다,하지만 그들은 자바에있는 정도 필요하지 않습니다. 즉, 필요하지 않은 코드를 작성하거나 원하는 경우 특정 용도로 사용할 수 있습니다.

2

이것은 Coursca의 'Scala With Functional Programming'예제 숙제입니다. 이런 종류의 질문에 대한 코스 포럼이 있습니다.

재귀를 자세히 살펴보고 추가 var없이이 작업을 해결해야합니다. 도우미 기능에 대한 목록 소스에 힌트가 있습니다. 그걸 써.

+1

내가 변경할 수 전역 상태는 힌트에 말할 때와 같은 암시 적 운동에 지정된 ('maxi') 사용하지 않음에 동의 "당신은 보조 방법을 정의 할 필요가 있습니다." –

1
def max(xs: List[Int]): Int = { 
    def loop(a: Int, b: List[Int]): Int = { 
    if (b.tail.isEmpty) 
     if (a >= b.head) a 
     else b.head 
    else 
     if (a >= b.head) loop(a, b.tail) 
     else loop(b.head, b.tail) 
    } 
    if (xs.isEmpty) throw new java.util.NoSuchElementException() 
    else loop(xs.head, xs.tail) 
    } 
0
def max(xs: List[Int]): Int = { 
    def maxNew(xs: List[Int], maxx: Int): Int ={ 
    if(xs.isEmpty) maxx else { 
    if (maxx<=xs.head) 
     maxNew(xs.tail, xs.head) 
    else 
     maxNew(xs.tail, maxx) 
    } 
} 

    if(xs.isEmpty) throw new java.util.NoSuchElementException() 
    else maxNew(xs,0)   
} 
+0

쉽고 재귀 적으로 사용하십시오. –

관련 문제