非递归函数的递归求解

   1: #include <stdio.h>
   2: #include <math.h>
   3: #include <stdlib.h>
   4: #define STACK_INIT_SIZE 20
   5: #define STACKINCREMENT 10
   6:  
   7: typedef  int ElemType;
   8: typedef struct {
   9:     ElemType *base;
  10:     ElemType *top;
  11:     int stacksize;
  12: } sqStack;
  13: /*初始化栈*/
  14: void initStack(sqStack *s)
  15: {
  16:     /*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
  17:     s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
  18:  
  19:     if(!s->base) exit(0);                /*分配空间失败*/
  20:  
  21:     s->top = s->base;                /*最开始,栈顶就是栈底*/
  22:     s->stacksize = STACK_INIT_SIZE;     /*最大容量为STACK_INIT_SIZE */
  23: }
  24: /*入栈操作,将e压入栈中*/
  25: void Push(sqStack *s, ElemType e) {
  26:     if(s->top - s->base >= s->stacksize) {
  27:         /*栈满,追加空间*/
  28:         s->base = (ElemType *)realloc(s->base, (s->stacksize +
  29:                                                 STACKINCREMENT) * sizeof(ElemType));
  30:  
  31:         if(!s->base) exit(0);                                /*存储分配失败*/
  32:  
  33:         s->top = s->base + s->stacksize;
  34:         s->stacksize = s->stacksize + STACKINCREMENT;        /*设置栈的最大容量*/
  35:     }
  36:  
  37:     *(s->top) = e;                                             /*放入数据*/
  38:     s->top++;
  39: }
  40: /*出栈操作,用e将栈顶元素返回*/
  41: void Pop(sqStack *s , ElemType *e) {
  42:     if(s->top == s->base) return;
  43:  
  44:     *e = *--(s->top);
  45: }
  46:  
  47: int f(int n)
  48: {
  49:     int r = 1, e;
  50:     sqStack stack;
  51:     initStack(&stack);                /*初始化栈*/
  52:  
  53:     while(n != 0) {
  54:         Push(&stack, n);            /*保存现场n*/
  55:         n = n / 2;
  56:     }
  57:  
  58:     while(stack.top != stack.base)
  59:     {
  60:         Pop(&stack, &e);
  61:         r = r * e;
  62:     }
  63:  
  64:     return r;
  65: }
  66:  
  67: int main()
  68: {
  69:     printf("The result for conversion of recursion to non recursion is\n");
  70:     printf("f(5)=%d \n", f(5));
  71:     return 0;
  72: }
原文地址:https://www.cnblogs.com/steven_oyj/p/1746965.html