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 메소드의 중지 조건이 다른 두 것과 약간 다르게 나타났습니다. 그것은 좌표계의 변형과 관련이 있습니다. 원점은 왼쪽 상단 구석에 표시되어야합니다. 그러나 나는 그것이 문제라고 여기지 않는다. 필드는 정확한 위치에 표시된다.
감사합니다. 솔루션 일뿐만 아니라 힌트도 제공합니다. – ceran