목차
Tarjan 의 의사 코드에 대한 설명을 다음 섹션으로 나누겠습니다 .
- Tarjan의 If-else 블록 (
->
및 |
연산자)
- 과제 및 평등 시험 (
:=
및 =
)
else if
이지만 else
구성 은 없습니다
- Tarjan의 조건부 할당 연산자
:= if
Tarjan if
과:= if
5.5 의 추가 예 .
타잔 배열 (또는리스트)
연산자 요약
- 타잔의 이중 화살표 연산자 (
⟷
)
- Tarjan의 do 루프는 C / Java while-loop와 같습니다.
- 모든 잘못된 조건을 가진 Tarjan의 조건부 할당 연산자
(1) 타잔의 If-else 블록
(연산자 →
및 |
)
이 if-else
구조는 아마도 Tarjan의 언어에서 가장 기본적인 제어 구조 일 것입니다. C와 같은 if-block 외에도, if-else 행동은 Tarjan의 할당과 Tarjan의 while 루프에 거의 내장되어 있습니다. Tarjan의 화살표 연산자 ->
(또는 →)는 if 문의 상태와 if 문의 실행 블록 사이의 구분 기호입니다.
예를 들어 Tarjan의 언어에는 다음이있을 수 있습니다.
# Example One
if a = 4 → x := 9 fi
우리가 경우 부분적으로 C 또는 Java로 위의 Tarjan 코드의 라인을 번역, 우리는 다음을 얻을 :
if (a = 4)
x := 9
fi
오른쪽 중괄호 대신 (C 및 Java에서와 같이) Tarjan if
은 키워드의 ALGOL과 유사한 역순으로 -block을 종료합니다 .fi
위 예제를 계속 번역하면 다음과 같은 결과를 얻습니다.
if (a = 4) {
x := 9
}
(2) 과제 및 평등 시험 ( :=
및 =
)
Tarjan은이 연산자를 ALGOL (나중에 Pascal에서도 볼 수 있음)에서 가져옵니다.
Tarjan은 =
할당이 아닌 동등성 테스트에 사용 하므로 Java처럼 작동합니다 ==
.
할당을 위해 Tarjan은 :=
Java처럼 작동하는을 사용합니다 =
.
따라서 우리의 예를 계속 번역하면 다음과 같은 결과가 나타납니다.
if (a == 4) {
x = 9
}
|
Tarjan 언어 의 세로 막대 (또는 "pipe"또는 ) else if
는 C 또는 Java 의 키워드 와 같습니다 .
예를 들어 Tarjan의 언어에는 다음이있을 수 있습니다.
# Example Two
if a = 4 → x := 9 | a > 4 → y := 11 fi
위의 Tarjan 코드는 다음과 같이 번역됩니다.
if (a == 4) {
x = 9
}
else if (a > 4) {
y = 11
}
(3) else if
만없고 else
구조체
이전 if
에는 뉘앙스를 설명하지 않고 진술 의 기본 사항을 다루었습니다. 그러나 우리는 작은 세부 사항에 대해서는 논의하지 않을 것입니다. Tarjan-ian if-else
블록 의 마지막 절 에는 항상 화살표 ( →
) 연산자가 포함되어야합니다 . 따라서 else
Tarjan의 언어 는 없습니다 else if
. else
Tarjan의 언어에서 블록에 가장 가까운 것은 가장 올바른 테스트 조건을 만드는 것 true
입니다.
if a = 4 → x := 9 | a > 4 → y := 11 | true → z := 99 fi
C / Java에서 우리는 :
if (a == 4) {
x = 9
}
else if (a > 4) {
y = 11
}
else { // else if (true)
z = 99
}
예는 일반적인 설명보다 이해하기 쉽습니다. 그러나 이제 우리는 벨트 아래에 몇 가지 예가 있으므로 Tarjan의 if-else 구문의 일반적인 형식은 다음과 같습니다.
if condition
→ stuff to do
| condition
→ stuff to do
[...]
| condition
→ stuff to do
fi
캐릭터 |
는if else
캐릭터 →
는 테스트 조건을 수행 할 작업과 분리합니다.
(4) Tarjan의 조건부 할당 연산자 := if
Tarjan if
은 두 가지 다른 방식으로 사용될 수 있습니다. 지금까지 Tarjanian의 사용법 중 하나만 설명했습니다 if
. 다소 혼란스럽게도 Tarjan은 여전히 if
두 번째 유형의 if
-construct에 표기법 / 구문 을 사용합니다 . 어떤 if
컨텍스트를 기반으로 사용하고 있습니다. 두 번째 유형의 Tarjan- if
은 항상 할당 연산자에 의해 미리 고정 되므로 컨텍스트 분석은 실제로 매우 쉽습니다 .
예를 들어 다음과 같은 Tarjan 코드가있을 수 있습니다.
# Example Three
x := if a = 4 → 9 fi
침략을 시작하십시오
Tarjan 코드로 잠시 작업 한 후 작업 순서에 익숙해집니다. 위 예제에서 테스트 조건을 괄호로 묶으면 다음과 같은 결과를 얻습니다.
x := if (a = 4) → 9 fi
a = 4
할당 작업이 아닙니다. a = 4
같다 a == 4
-참 또는 거짓을 돌려 준다.
엔드 디 펜션
그것은 생각하는 데 도움이 될 수 있습니다 := if
별개의 단일 연산자, 구문 등 :=
과 if
사실, 우리가 참조 할 := if
은 "조건부 과제"연산자로 연산자.
들어 if
우리는 목록 (condition → action)
. 들어 := if
우리가 목록으로 (condition → value)
어디에 value
우리가 왼손 측에 할당 할 수 있습니다 TEH 오른쪽 측면 값은lhs
# Tarjan Example Four
lhs := if (a = 4) → rhs fi
C 또는 Java에서 다음과 같이 보일 수 있습니다.
# Example Four
if (a == 4) {
lhs = rhs
}
Tarjanian 코드에서 다음의 "조건부 할당"예제를 고려하십시오.
# 예 5의 Tarjan 인스턴스화 x x : = a = 4 → 9 | a> 4 → 11 | 참 → 99 fi
C / Java에서 우리는 :
// C/Java Instantiation of Example Five
if (a == 4) {
x = 9
}
else if (a > 4) {
x = 11
}
else if (true) { // else
x = 99
}
(5) 연산자 요약 :
지금까지 우리는 :
:=
...... 할당 연산자 (C / Java =
)
=
...... 평등 테스트 (C / Java ==
)
→
...... if-block의 테스트 조건과 if-block의 본문 사이의 구분자
|
..... C / Java else-if
if ... fi
..... if-else 블록
:= if... fi
..... if-else 블록을 기반으로하는 조건부 할당
(5.5) Tarjan 목록 / 배열 :
Tarjan의 언어에는 내장형 배열 컨테이너가 있습니다. Tarjan 배열의 구문은 Tarjan if else
문 표기법보다 훨씬 직관적 입니다.
list1 := ['lion', 'witch', 'wardrobe'];
list2a := [1, 2, 3, 4, 5];
list2b := [1, 2];
list3 := ["a", "b", "c", "d"];
list4 := [ ]; # an empty array
Tarjan 배열 elementa는 ()
대괄호가 아닌 괄호로 액세스 됩니다.[]
색인은에서 시작합니다 1
. 그러므로,
list3 := ["a", "b", "c", "d"]
# list3(1) == "a" returns true
# list3(2) == "b" return true
아래는 첫 번째 및 다섯 번째 요소를 포함하는 새 배열을 만드는 방법을 보여줍니다. [1, 2, 3, 4, 5, 6, 7]
nums := [1, 2, 3, 4, 5, 6, 7]
new_arr := [nums(1), nums(5)]
항등 연산자는 배열에 대해 정의됩니다. 다음 코드 인쇄true
x := false
if [1, 2] = [1, 2, 3, 4, 5] --> x := true
print(x)
배열이 비어 있는지 테스트하는 Tarjan의 방법은 빈 배열과 비교하는 것입니다.
arr := [1, 2]
print(arr = [ ])
# `=` is equality test, not assignment
하나는 운영자에게 복수의 지표를 제공하여, 서브 - 어레이의 뷰 (되지 복사)을 만들 수있는 ()
결합..
list3 := ["a", "b", "c", "d"]
beg := list3(.. 2)
# beg == ["a", "b"]
# beg(1) == "a"
end := list3(3..)
# end == ["c", "d"]
# end(1) == "c"
mid := list3(2..3)
# mid == ["b", "c"]
# mid(2) == "c"
# `list3(4)` is valid, but `mid(4)` is not
(6) Tarjan if
과:= if
다음은 Tarjan 조건부 할당 ( := if
) 의 다른 예입니다 .
# Tarjan Example Six
a := (false --> a | true --> b | false --> c1 + c2 | (2 + 3 < 99) --> d)
(true --> b)
(cond --> action)
조건 이 가장 왼쪽 인 절입니다. 따라서 원래 과제 Example Six는 다음과 같은 과제 동작을 갖습니다.a := b
아래는 지금까지 가장 복잡한 Tarjan 코드 예입니다.
# Tarjan Example -- merge two sorted lists
list function merge (list s, t);
return if s =[] --> t
| t = [ ] --> s
| s != [ ] and t != [] and s(l) <= t(1) -->
[s(1)]& merge(s[2..], t)
| s != [ ]and t != [ ] and s(1) > r(l) -->
[t(1)] & merge (s,t(2..))
fi
end merge;
다음은 두 가지 정렬 된 목록을 병합하기위한 Tarjan 코드의 번역입니다. 다음은 정확히 C 또는 Java는 아니지만 Tarjan 버전보다 C / Java에 훨씬 가깝습니다.
list merge (list s, list t) {
if (s is empty) {
return t;
}
else if (t is empty){
return s;
}
else if (s[1] <= t[1]) {
return CONCATENATE([s[1]], merge(s[2...], t));
else { // else if (s[1] > t[1])
return CONCATENATE ([t[1]], merge(s,t[2..]);
}
}
아래는 Tarjan-code의 또 다른 예이며 C 또는 Java와 유사한 번역입니다.
heap function meld (heap h1, h2);
return if h1 = null --> h2
| h2 = null --> h1
| h1 not null and h2 not null --> mesh (h1, h2)
fi
end meld;
아래는 C / Java 번역입니다.
HeapNode meld (HeapNode h1, HeapNode h2) {
if (h1 == null) {
return h2;
}
else if (h2 == null) {
return h1;
} else {
mesh(h1, h2)
}
} // end function
(7) 타잔의 이중 화살표 연산자 ( <-->
)
다음은 Tarjan 코드의 예입니다.
x <--> y
이중 화살표 ( ⟷
) 연산자는 Tarjan의 언어로 무엇을합니까?
Tarjan 's Language의 거의 모든 변수는 포인터입니다.
<-->
스왑 작업입니다. 다음 인쇄true
x_old := x
y_old := y
x <--> y
print(x == y_old) # prints true
print(y == x_old) # prints true
수행 한 후 x <--> y
, x
목적으로 포인트 y
와 포인트 사용 y
목적에 지점 x
을 가리키는 데 사용.
아래는 <-->
연산자를 사용하는 Tarjan 문입니다 .
x := [1, 2, 3]
y := [4, 5, 6]
x <--> y
아래는 위의 Tarjan 코드에서 다른 유사 코드로의 변환입니다.
Pointer X = address of array [1, 2, 3];
Pointer Y = address of array [4, 5, 6];
Pointer X_OLD = address of whatever X points to;
X = address of whatever Y points to;
Y = address of whatever X_OLD points to;
또는 다음과 같이 할 수 있습니다.
void operator_double_arrow(Array** lhs, Array** rhs) {
// swap lhs and rhs
int** old_lhs = 0;
old_lhs = lhs;
*lhs = *rhs;
*rhs = *old_lhs;
return;
}
int main() {
Array* lhs = new Array<int>(1, 2, 3);
Array* rhs = new Array<int>(4, 5, 6);
operator_double_arrow(&lhs, &rhs);
delete lhs;
delete rhs;
return 0;
}
아래는 ⟷
연산자를 사용하는 Tarjan의 기능 중 하나의 예입니다 .
heap function mesh (heap nodes h1, h2);
if key(h1) > key(h2) → h1 ⟷ h2 fi;
right (h1) := if right(h1) = null → h2
|right(h1) ≠ null → mesh (right(h1), h2)
fi;
if rank (left (h1)) < rank (right (h1))
→ left(h1) ⟷ right(h1)
fi;
rank (h1) := rank(right(h1)) + 1;
return h1;
end mesh;
아래는 Tarjan의 mesh
함수를 C가 아닌 의사 코드로 변환 한 것이지만 C와 비슷해 보입니다 (상대적으로 말하면). 이것의 목적은 Tarjan의 ⟷
운영자의 작동 방식을 설명하기위한 것입니다 .
node pointer function mesh(node pointers h1, h2) {
if (h1.key) > h2.key) {
// swap h1 and h2
node pointer temp;
temp = h1;
h1 = h2;
h2 = temp;
}
// Now, h2.key <= h1.key
if (h1.right == null) {
h1.right = h2;
} else // h1.key != null {
h1.right = mesh(h1.right, h2);
}
if (h1.left.rank < h1.right.rank ) {
// swap h1.left and h1.right
node pointer temp;
temp = h1;
h1 = h2;
h2 = temp;
}
h1.rank = h1.right.rank + 1;
return h1;
}
(8) Tarjan의 do 루프는 C / Java while-loop와 같습니다.
Tarjan의 언어 if
와 for
구문은 C / Java 프로그래머에게 친숙합니다. 그러나 while 루프의 Tarjan 키워드는 do
입니다. 모든 do
키워드에 끝 -loops od
의 맞춤법 검사를 거꾸로입니다 do
. 아래는 예입니다.
sum := 0
do sum < 50 → sum := sum + 1
C 스타일의 의사 코드에는 다음이 있습니다.
sum = 0;
while(sum < 50) {
sum = sum + 1;
}
위의 내용은 실제로 옳지 않습니다. Tarjan do-loop는 실제로 while(true)
if-else 블록이 중첩 된 C / Java 입니다. Tarjan 코드를보다 문자 그대로 번역하면 다음과 같습니다.
sum = 0;
while(true) {
if (sum < 50) {
sum = sum + 1;
continue;
// This `continue` statement is questionable
}
break;
}
아래에는 좀 더 복잡한 Tarjan do
루프가 있습니다.
sum := 0
do sum < 50 → sum := sum + 1 | sum < 99 → sum := sum + 5
복잡한 Tarjan do
-loop의 C / Java 스타일 의사 코드 는 다음과 같습니다.
sum = 0;
while(true) {
if (sum < 50) {
sum = sum + 1;
continue;
}
else if (sum < 99) {
sum = sum + 5;
continue;
}
break;
}
(9) 모든 잘못된 조건을 가진 Tarjan의 조건부 할당 연산자
위의 긴 설명은 대부분의 내용을 다루지 만 몇 가지 문제는 여전히 해결되지 않은 상태로 남아 있습니다. 언젠가 다른 사람들이 언젠가이 질문에 답하는 내 기반의 새로운 개선 된 답변을 쓰길 바랍니다.
특히 조건부 할당 연산자 := if
를 사용하고 조건이 true가 아닌 경우 변수에 할당 된 값이 아닙니다.
x := if (False --> 1| False --> 2 | (99 < 2) --> 3) fi
확실하지 않지만 다음과 같이 할당되지 않을 수 있습니다 x
.
x = 0;
if (false) {
x = 1;
}
else if (false) {
x = 2;
}
else if (99 < 2) {
x = 3;
}
// At this point (x == 0)
:= if
명령문에 표시된 왼쪽 변수를 이전에 선언 하도록 요구할 수 있습니다. 이 경우 모든 조건이 거짓이더라도 변수는 여전히 값을 갖습니다.
또는 모두 거짓 조건은 런타임 오류를 나타냅니다. 또 다른 대안은 특별한 null
값 을 반환 null
하고 과제의 왼쪽 인수에 저장하는 것입니다.