Download PDF

Transcript
Stack Usage and Parameter Passing
47
Binary Search
We will now encode a more complicated algorithm, making the following assumptions:
- an array contains objects consisting of 2 bytes.
- the objects.in the array are in a particular order.
- ORDERING compares 2 objects.
: BINSEARCH. I
INVARRAY: ROW
INPUT:
UPPERBOUND,OBJECT
LOCAL:
FOUND,LEFT,MIDDLE,RIGHT
( FOUND and LEFT are properly initialized: 0 )
UPPERBOUND TO RIGHT
BEGIN RIGHT LEFT < >
WHILE RIGHT LEFT + 2/ TO MIDDLE
MIDDLE ROW OBJECT ORDERING
DOCASE
- I CASE MIDDLE LEFT =
IF LEFT TO RIGHT
( not present)
ELSE MIDDLE TO LEFT
THEN
ELSE
o CASE I TO FOUND
LEFT TO RIGHT
ELSE
I CASE MIDDLE TO RIGHT
ENDCASE
REPEAT
FOUND
IF
OUTPUT:MIDDLE,FOUND
ELSE OUTPUT:FOUND
THEN;
: BINSEARCH.2
ROT ROT 0
BEGIN 2DUP < >
WHILE 2DUP + 2/ DUP
2* 5 PICK + @
6 PICK ORDERING
DOCASE
- I CASE 2DUP =
IF
2DROP DUP
ELSE UNDER
THEN
ELSE
o CASE UNDER UNDER UNDER
UNDER I EXIT
ELSE
I CASE ROT DROP SWAP
ENDCASE
REPEAT
2DROP 2DROP 0 ;
Note the differences in selfdocumenting power.