Накнопал вот такой прекрасный код:
#include <iostream>
#include <stack>
using namespace std;
void showM(int M[], int l, int r)
{
for(int i = l; i <= r; i++) cout << M[i] << " ";
cout << endl;
}
int main ()
{
const int size = 8;
int M[size] = {1,5,2,4,5,3,2,0};
stack<int> st;
int ret_flag = 0; int t;
int s = 0, e = size-1;
showM(M, 0, size-1);
func:
int l = s, r = e;
int G = M[l];
m3:
while (M[l]<G) l++;
while (M[r]>G) r--;
if (l>r) goto m4;
t=M[l]; M[l]=M[r];M[r]=t;
l++;r--;
goto m3;
m4:
if(l<=r) goto m5;
if(M[r]<=M[l]) goto m5;
t=M[l]; M[l]=M[r]; M[r]=t;
m5:
if(l-s <= 1) goto m1;
st.push(s); st.push(e); st.push(l); st.push(ret_flag);
ret_flag = 2;
e = l-1;
goto func;
ret2:
ret_flag=st.top();st.pop();l=st.top();st.pop();e=st.top();st.pop();s=st.top();st.pop();
m1:
if(e-l < 1) goto m2;
st.push(s); st.push(e); st.push(l); st.push(ret_flag);
ret_flag = 1;
s = l;
goto func;
ret1:
ret_flag=st.top();st.pop();l=st.top();st.pop();e=st.top();st.pop();s=st.top();st.pop();
m2:
if(ret_flag==1) goto ret1;
if(ret_flag==2) goto ret2;
showM(M, 0, size-1);
return 0;
}
Поразительно, как раньше люди писали программы, когда языки не поддерживали красивую структурную вложенность? Я сломал себе половину мозга, пока реализовал это несложный алгоритм.
Отдельной проблемой было представить как правильно реализовать рекурсию без такой структуры, как "функция". Пришлось писать "болванку" с переходами для того, чтобы представить себе как рекурсивная функция должна вызываться из двух мест собственного тела.
Естественно, столкнулся с проблемой "кочующей переменной", когда значение переменной приходит из другой части кода, а не должно (забыл положить в стек L).
Опять-таки непонятно как вообще можно написать что-то существенное на языке, который не поддерживает действительноДлинныеИменаПеременных.
Вы спросите, для чего же было терпеть все эти мучения и ужас? Дело в том, что мне нужно реализовать это на ассемблере. Думаю, что такой код теперь не сложно будет перевести.






Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.