1. 程式人生 > >利用棧實現遞迴函式的非遞迴計算

利用棧實現遞迴函式的非遞迴計算

題目描述: 在這裡插入圖片描述 棧的實現及棧的基本操作:

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
#include<cstring>
#define max 50;
typedef char type;
typedef struct
{
    type data[50];
    int top;
}stack;
void initialstack(stack *s)
{
    s->top = 0;
}
int push(stack *s, type x)
{
    if (s->top == 50)
        return -1;
    s->data[s->top++] = x;
    return 0;
}
type pop(stack *s)
{
    if (s->top == 0)
        return -2;
    type x = s->data[--s->top];
    return x;
}

題目解答:

int count3()
{//基本思想:由P0,P1的值可以直接得到P2的值,根據P1,p2的值可以得到P3的值,依次類推
    int n, x;
    stack *s1 = (stack *)malloc(sizeof(stack));
    initialstack(s1);
    scanf_s("%d %d",&n,&x);
    if (n == 0)
        return 1;
    else if (n == 1)
        return 2 * x;
    else
    {
        for (int i = 0; i <=n;i++)
        {
            if (i == 0)
                push(s1, 1);
            else if (i == 1)
                push(s1, 2*x);
            else
            {
                int tem1 = pop(s1); 
                int value = 2 * x*tem1 - 2 * (i - 1)*pop(s1);//當i=2時,出P0,P1的值,算出P2的值,再將P1,P2的值進棧方便算P3的值
                printf("value:%d ", value);              //最先出棧的值應儲存下來,與計算出來的新值先後壓入棧;
                push(s1, tem1);
                push(s1, value);
            }
        }
    }
    return 2 * x*pop(s1) - 2 * (n - 1)*pop(s1);//最後棧頂的值分別是Pn-1與Pn-2
}