let x = 0
let y = 0
let d = 1
let m = 1
while true
while 2 * x * d < m
print(x, y)
x = x + d
while 2 * y * d < m
print(x, y)
y = y + d
d = -1 * d
m = m + 1
이 문제에 대한 여러 가지 제안 된 솔루션이 다양한 프로그래밍 언어로 작성되었지만 모두 동일한 복잡한 접근 방식에서 비롯된 것 같습니다. 유도를 사용하여 간결하게 표현할 수있는 나선을 계산하는 더 일반적인 문제를 고려할 것입니다.
기본 사례 : (0, 0)에서 시작하여 1 칸 앞으로 이동, 좌회전, 1 칸 앞으로 이동, 좌회전. 유도 단계 : n + 1 제곱 앞으로 이동, 좌회전, n + 1 제곱 앞으로 이동, 좌회전.
이 문제를 표현하는 수학적 우아함은 해를 계산하기위한 간단한 알고리즘이 있어야한다는 것을 강력하게 암시합니다. 추상화를 염두에두고 알고리즘을 특정 프로그래밍 언어로 구현하지 않고 의사 코드로 구현하기로했습니다.
먼저 4 쌍의 while 루프를 사용하여 나선형의 2 회 반복 만 계산하는 알고리즘을 살펴 보겠습니다. 각 쌍의 구조는 비슷하지만 그 자체로 구별됩니다. 이것은 처음에는 미친 것처럼 보일 수 있지만 (일부 루프는 한 번만 실행 됨) 단계별로 우리는 동일한 4 쌍의 루프에 도달 할 때까지 변환을 수행하므로 다른 루프 안에 배치 된 단일 쌍으로 대체 할 수 있습니다. 이를 통해 조건을 사용하지 않고 반복 계산을위한 일반적인 솔루션을 제공 할 수 있습니다.
let x = 0
let y = 0
//RIGHT, UP
while x < 1
print(x, y)
x = x + 1
while y < 1
print(x, y)
y = y + 1
//LEFT, LEFT, DOWN, DOWN
while x > -1
print(x, y)
x = x - 1
while y > -1
print(x, y)
y = y - 1
//RIGHT, RIGHT, RIGHT, UP, UP, UP
while x < 2
print(x, y)
x = x + 1
while y < 2
print(x, y)
y = y + 1
//LEFT, LEFT, LEFT, LEFT, DOWN, DOWN, DOWN, DOWN
while x > -2
print(x, y)
x = x - 1
while y > -2
print(x, y)
y = y - 1
우리가 할 첫 번째 변형은 방향을 위해 +1 또는 -1 값을 보유하는 새로운 변수 d를 도입하는 것입니다. 방향은 각 루프 쌍 후에 전환됩니다. 모든 점에서 d의 값을 알기 때문에 각 부등식의 각 변에 곱하고 부등식의 방향을 조정하고 d에 대한 상수를 다른 상수에 대한 곱셈을 단순화 할 수 있습니다. 이것은 우리에게 다음을 남깁니다.
let x = 0
let y = 0
let d = 1
//RIGHT, UP
while x * d < 1
print(x, y)
x = x + d
while y * d < 1
print(x, y)
y = y + d
d = -1 * d
//LEFT, LEFT, DOWN, DOWN
while x * d < 1
print(x, y)
x = x + d
while y * d < 1
print(x, y)
y = y + d
d = -1 * d
//RIGHT, RIGHT, RIGHT, UP, UP, UP
while x * d < 2
print(x, y)
x = x + d
while y * d < 2
print(x, y)
y = y + d
d = -1 * d
//LEFT, LEFT, LEFT, LEFT, DOWN, DOWN, DOWN, DOWN
while x * d < 2
print(x, y)
x = x + d
while y * d < 2
print(x, y)
y = y + d
이제 x * d와 RHS는 모두 정수이므로 불평등의 결과에 영향을주지 않으면 서 RHS에서 0과 1 사이의 실제 값을 뺄 수 있습니다. 더 많은 패턴을 설정하기 위해 다른 모든 한 쌍의 while 루프의 불평등에서 0.5를 뺍니다.
let x = 0
let y = 0
let d = 1
//RIGHT, UP
while x * d < 0.5
print(x, y)
x = x + d
while y * d < 0.5
print(x, y)
y = y + d
d = -1 * d
//LEFT, LEFT, DOWN, DOWN
while x * d < 1
print(x, y)
x = x + d
while y * d < 1
print(x, y)
y = y + d
d = -1 * d
//RIGHT, RIGHT, RIGHT, UP, UP, UP
while x * d < 1.5
print(x, y)
x = x + d
while y * d < 1.5
print(x, y)
y = y + d
d = -1 * d
//LEFT, LEFT, LEFT, LEFT, DOWN, DOWN, DOWN, DOWN
while x * d < 2
print(x, y)
x = x + d
while y * d < 2
print(x, y)
y = y + d
이제 각 while 루프 쌍에서 수행하는 단계 수에 대해 다른 변수 m을 도입 할 수 있습니다.
let x = 0
let y = 0
let d = 1
let m = 0.5
//RIGHT, UP
while x * d < m
print(x, y)
x = x + d
while y * d < m
print(x, y)
y = y + d
d = -1 * d
m = m + 0.5
//LEFT, LEFT, DOWN, DOWN
while x * d < m
print(x, y)
x = x + d
while y * d < m
print(x, y)
y = y + d
d = -1 * d
m = m + 0.5
//RIGHT, RIGHT, RIGHT, UP, UP, UP
while x * d < m
print(x, y)
x = x + d
while y * d < m
print(x, y)
y = y + d
d = -1 * d
m = m + 0.5
//LEFT, LEFT, LEFT, LEFT, DOWN, DOWN, DOWN, DOWN
while x * d < m
print(x, y)
x = x + d
while y * d < m
print(x, y)
y = y + d
마지막으로, 각 한 쌍의 while 루프의 구조는 동일하며 다른 루프 안에 배치 된 단일 루프로 축소 될 수 있습니다. 또한 실제 숫자를 사용하지 않기 위해 m의 초기 값을 곱했습니다. 값 m은 증분된다; 각 불평등의 양쪽에 2 씩
이것은이 답변의 시작 부분에 표시된 솔루션으로 이어집니다.