while - swift switch문




C-Style for 루프가 Swift 3에서 제거 될 예정인 지금 루프를 실행하지 않는 간결한 방법은 무엇입니까? (3)

변수 i 는 항상 memoizing 배열의 count 와 같으므로 루프 상태로 사용할 수 있습니다.

func fibonacci(n: Int) -> Int {
  var memo = [0,1]
  while n >= memo.count {
    memo.append(memo[memo.count-1] + memo[memo.count-2])
  }
  return memo[n]
}

또는 루프를 재귀 함수로 표현할 수도 있습니다.

func fibonacci(n: Int) -> Int {
  var memo = [0,1]
  func rec(i: Int) -> Int {
    if i >= memo.count { memo.append(rec(i-2) + rec(i-1)) }
    return memo[i]
  }
  return rec(n)
}

정말로, 그래도, 여기가 최고의 해결책입니다. Range 는 끝이 디자인보다 처음보다 작지 않도록합니다. 추가 행 :

func fibonacci(n: Int) -> Int {
  if n < 2 { return n }
  var memo = [0,1]
  for i in 2...n {
    memo.append(memo[i-1] + memo[i-2])
  }
  return memo[n]
}

읽고 이해할 수 있습니다. (내 눈에는 위 코드가 for ;; 버전보다 낫다)

이 코드가 n >= 0 완벽하게 작동한다고 가정 해보십시오.

func fibonacci(n: Int) -> Int {
    var memo = [0,1]
    for var i = 2; i <= n; i++ {
        memo.append(memo[i-1] + memo[i-2])
    }
    return memo[n]
}

Swift 3.0의 향후 변경 사항으로 인해 C 스타일의 루프를 제거하면 다음과 같은 결과가 나옵니다.

func fibonacci(n: Int) -> Int {
    var memo = [0,1]
    for i in 2...n {
        memo.append(memo[i-1] + memo[i-2])
    }
    return memo[n]
}

n >= 2 잘 작동하는 동안이 오류 메시지와 함께 숫자 01 실패합니다 :

치명적인 오류 : 끝 <시작으로 Range를 형성 할 수 없음

01 제대로 작동하도록이 코드를 수정하는 가장 간결한 방법은 무엇입니까?

(참고 : 음수가 앱을 크래킹하는 것이 좋으며 심지어 바람직합니다.)

참고 : 보호 진술을 추가 할 수 있음을 알고 있습니다.

guard n >= 2 else { return memo[n] }

...하지만 코드의 결함 부분 ( 2...n )을 수정하는 더 좋은 방법이 있기를 바라고 있습니다.

예를 들어, end < start 인 경우 0 요소를 반환하는 범위를 만드는 간결한 방법이있는 경우 더 이상적인 솔루션입니다.


max() 함수를 사용하여 유효한 범위를 쉽게 만들 수 있습니다.

for i in 2 ..< max(2, n+1) {
    memo.append(memo[i-1] + memo[i-2])
}

n < 2 경우 빈 범위 2 ..< 2 평가됩니다.

2 ... 1 이 유효한 범위가 아니기 때문에 상한을 제외 하는 ..< 연산자를 사용하는 것이 중요합니다.

그러나이 기능에서 나는 특별한 경우를 먼저 다루어야한다.

func fibonacci(n: Int) -> Int {
    // Let it crash if n < 0:
    precondition(n >= 0, "n must not be negative")

    // Handle n = 0, 1:
    if n <= 1 {
        return n
    }

    // Handle n >= 2:
    var memo = [0,1]
    for i in 2 ... n {
        memo.append(memo[i-1] + memo[i-2])
    }
    return memo[n]
}

( memo 배열은 각 함수 호출에 대해 초기 값 [0, 1] 로 설정되어 있으므로 값은 실제로 "memoized"되지 않습니다. 메모가 없으면 배열이 필요하지 않고 마지막 두 개 숫자는 다음을 계산합니다.)


n <2에서 작동하는 방식으로이를 수행하려면 stride 메소드를 사용할 수 있습니다.

let startIndex = 2
let endIndex = n

for i in stride(from: startIndex, through: endIndex, by: 1) {
    memo.append(memo[i-1] + memo[i-2])
}




range