2014-11-13 3 views
0

n * n * n 큐브를 나타내는 데이터 구조를 만들었습니다.이 경우 4 * 4 * 4 큐브입니다. 디버깅을 목적으로 큐브를 표준 출력으로 출력하는 메서드를 구현하고 싶습니다. 결과는 4 개의 레이어로 구성되어야하며 각 레이어는 4x4 영역으로 구성됩니다.스칼라에서 재귀를 사용하여 정확한 결과 얻기

저는 스칼라를 배우기 때문에 "기능적 방식"으로이를 수행하고 재귀 적 솔루션을 제시했습니다. drawCube 메서드는 모든 레이어에서 "반복"되고 레이어의 선 위로는 drawLayer 메서드가 반복되고 drawLine 메서드는 한 줄을 담당합니다.

  • 각 라인은 시작
  • 층 대시 라인으로 구분해야 슬래시 끝나야

코드에 관계없이 난 여부

def drawCube = { 
    val n = cube.sidelength 
    val nl = sys.props("line.separator") 
    val border = " -" * (n * 2 -1) 

    def drawLine(acc: String, x: Int, y: Int, z: Int): String = { 
     if(x < n) drawLine(acc + getField(x, y, z), x + 1, y, z) else <PosA> + acc + "/" + nl 
    } 
    def drawLayer(acc: String, y: Int, z: Int): String = { 
     if(z >= 0) drawLayer(<PosB> + drawLine(acc, 0, y, z), y, z - 1) else acc + border + nl 
    } 
    def drawCube(acc: String, y: Int): String = { 
     if(y < n) drawCube(drawLayer(acc, y, n - 1), y + 1) else border + nl + acc 
    } 
    def getField(x: Int, y: Int, z: Int) = { 
     // returns a string representation of a specific field from the cube 
     // in the following example, it's just a dot for the sake of simplicity 
     // in a 4x4x4 cube, the range of x, y and z is from 0 to 3 
    } 
    println(drawCube("", 0)) 
    } 

위치 A에 또는 위치에 추가 "/"넣기 (위의 자리 표시 자 참조), 나는 법이지 다음과 같은 결과가 점점 :

- - - - - - - 
//////////////// . . . ./
. . . ./
. . . ./
. . . ./
- - - - - - - 
. . . ./
. . . ./
. . . ./
. . . ./
- - - - - - - 
. . . ./
. . . ./
. . . ./
. . . ./
- - - - - - - 
. . . ./
. . . ./
. . . ./
. . . ./
- - - - - - - 

당신이 볼 수 있듯이을, 모든 모든 라인의 시작 한 x에 인쇄하는 선도적 인 슬래시,의를 제외하고 잘 작동합니다. 왜 그런가요? 올바른 위치는 무엇입니까? 아마도 나는 그걸로 너무 많은 시간을 보냈지 만 지금 당장 문제를 볼 수는 없다. 고마워.

편집 : drawLayer 메소드의 중지 조건이 다른 두 것과 약간 다르게 나타났습니다. 그것은 좌표계의 변형과 관련이 있습니다. 원점은 왼쪽 상단 구석에 표시되어야합니다. 그러나 나는 그것이 문제라고 여기지 않는다. 필드는 정확한 위치에 표시된다.

답변

1

기능적 스타일의 큰 장점은 작은 방법을 개별적으로 테스트 할 수 있다는 것입니다. drawLine을 단독으로 테스트하거나 drawLine을 더 간단한 것으로 바꾸고 drawLayer으로 테스트 해보십시오. 기본 기능이 작동 할 때까지 누산기를 피하는 것이 좋습니다 - 간단한 0 until n map {drawLine(_, y, z)} mkString은 잘못 될 가능성이 적습니다.

귀하의 특정 질문에 대답하기 위해 누적 기는 항상 큐브의 현재 도면이며 모든 함수의 반환 값입니다. 그러므로 항상 "/" + acc 또는 "/" + drawSomething()을 할 수 없으므로 항상 "/"가 맨 앞에 추가됩니다. 대신 acc, 앞에을 호출하기 전에 "/"을 추가해야합니다. drawLine으로 전화하십시오. 즉 drawLayer은 다음과 같이 정의해야합니다.

def drawLayer(acc: String, y: Int, z: Int): String = 
    if(z >= 0) drawLayer(drawLine(acc + "/", 0, y, z), y, z - 1) else acc + "-" + "\n" 
+0

감사합니다. 솔루션 일뿐만 아니라 힌트도 제공합니다. – ceran