조건부 루프

대부분의 기존 프로그래밍 언어와 마찬가지로 Q#은 조건에 따라 중단되는 루프, 즉 반복 횟수를 알 수 없고 실행할 때마다 다를 수 있는 루프를 지원합니다. 컴파일 시간에 명령 시퀀스를 알 수 없기 때문에 컴파일러는 양자 런타임에서 특정 방식으로 이러한 조건부 루프를 처리합니다.

중요

양자 하드웨어 제한 사항

조건에 따라 중단되는 루프는 조건이 측정 결과에 따라 달라지는 경우 양자 하드웨어에서 처리하기가 어렵습니다. 실행할 명령 순서의 길이를 미리 알 수 없기 때문에.

특정 클래스의 양자 알고리즘에 공통적으로 존재함에도 불구하고 현재 하드웨어는 아직 이러한 종류의 제어 흐름 구문에 대한 네이티브 지원을 제공하지 않습니다. 양자 하드웨어에서 이러한 종류의 루프를 실행하는 것은 향후 최대 반복 수를 부과하거나 추가 하드웨어 지원을 사용할 수 있게 되면 잠재적으로 지원될 수 있습니다. 그러나 양자 시뮬레이터는 측정값에 따라 모든 루프를 실행합니다.

컴파일 루프

조건이 양자 측정에 의존하지 않는 한 조건부 루프는 양자 프로세서에 명령 시퀀스를 보내기 전에 Just-In-Time 컴파일을 통해 처리됩니다. 특히, 함수 내에서 함수 내의 코드는 항상 기존(비양자) 하드웨어에서 실행 가능하므로 함수 내에서 조건부 루프를 사용하는 것은 문제가 되지 않습니다. Q#따라서 는 함수 내에서 기존 while 루프의 사용을 지원합니다.

식 반복

양자 시뮬레이터 Q# 에서 프로그램을 실행할 때 양자 측정 결과에 따라 제어 흐름을 표현할 수 있습니다. 이 기능은 계산 비용을 크게 줄일 수 있는 확률적 구현을 가능하게 합니다. 일반적인 예로는 일반적으로 측정에 따라 달라지는 특정 조건이 충족될 때까지 계산을 반복하는 repeat-until-success 패턴이 있습니다. 이러한 repeat 루프는 양자 알고리즘의 특정 클래스에서 널리 사용됩니다. 따라서 Q#에는 양자 하드웨어에서 실행하는 데 여전히 문제가 있음에도 불구하고 이를 표현하기 위한 전용 언어 구문이 있습니다.

식은 repeat 다음 형식을 사용합니다.

repeat {
    // ...
}
until condition
fixup {
    // ...
}

또는

repeat {
    // ...
}
until condition;

여기서 conditionBool 형식의 임의 식입니다.

루프는 repeat 조건을 평가하기 전에 문 블록을 실행합니다. 조건이 true로 평가되면 루프가 존재합니다. 조건이 false로 평가되면 선택적 fixup 블록의 일부로 정의된 문의 추가 블록이(있는 경우) 다음 루프 반복을 시작하기 전에 실행됩니다.

While 루프

클래식 계산에 더 친숙한 루프는 while 키워드(keyword)while, 형식Bool의 식 및 문 블록으로 구성된 루프입니다. 예를 들어, arr이 양의 정수 배열인 경우

mutable (item, index) = (-1, 0);
while index < Length(arr) && item < 0 {
    set item = arr[index];
    set index += 1;
}

조건이 true로 평가되는 한 문 블록이 실행됩니다.