⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nonrec.cpp

📁 经典c++程序的实现
💻 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 + -