📄 nonrec.cpp
字号:
#include <stdio.h>
#include <assert.h>
#include <iostream.h>
typedef struct elem {
int rd, pn, pf, q1, q2; // return address, n, f, u1, u2
} ELEM;
#include "..\include\book.h"
#include "..\include\astack.h"
class nonrec {
private:
Stack S;
void Enter(ELEM& x) { // store data value on the stack
S.push(x);
}
public:
nonrec(void) { } // constuctor
void replace1(int n, int& f); // replace recursive
};
void nonrec::replace1(int n, int& f) {
ELEM x, tmp;
x.rd = 3; x.pn = n;
Enter(x);
label0: if ((x = S.topValue()).pn < 2) {
S.pop( );
x.pf = x.pn + 1;
Enter(x);
goto label3;
}
x.rd = 1; // The first recursive statement
x.pn = (int)(x.pn/2);
Enter(x);
goto label0;
label1: tmp = S.pop();
x = S.pop(); // The second recursive statement
x.q1 = tmp.pf; // modify the u1 as returned pf
Enter(x);
x.pn = (int)(x.pn/4);
x.rd = 2;
Enter(x);
goto label0;
label2: tmp = S.pop();
x = S.pop();
x.q2 = tmp.pf;
x.pf = x.q1 * x.q2; // modify the q2 and pf
Enter(x);
label3: x = S.topValue();
switch(x.rd) {
case 1 : goto label1;
break;
case 2 : goto label2;
break;
case 3 : tmp = S.pop();
f = tmp.pf;
break;
default : cerr << "error label number in stack";
break;
}
}
void main(void) {
nonrec rep;
int f;
rep.replace1(7, f);
cout << "f(17) = " << f << endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -