73.png

    1. /*
    2. 利用一个栈实现以下递归函数的非递归计算
    3. 分析:
    4. 这里我们需要使用栈的先进后出特性。我们可以看出,从n=2开始,每一个值便都与前两个值挂钩,且式子不变,我们
    5. 可以从栈顶到栈底依次边出栈边计算,直至栈底,便可以得出最终结果。
    6. */
    7. #define _CRT_SECURE_NO_WARNINGS
    8. #include <stdio.h>
    9. #include <stdlib.h>
    10. struct Recursion {
    11. int no;
    12. int val;
    13. };
    14. struct Stack {
    15. Recursion *arr;
    16. int len;
    17. int top;
    18. };
    19. int getP(Stack *s,int n,int x) {//该算法函数,传入栈,n和x
    20. if (n==0) {
    21. return 1;
    22. }
    23. int fv1 = 1, fv2 = 2 * x;
    24. for (int i = n; i >= 2;i--) {//将序号入栈,从上至下,从2到n
    25. s->top++;
    26. s->arr[s->top].no = i;
    27. }
    28. while (s->top>=0) {//边出栈边计算
    29. s->arr[s->top].val = 2 * x*fv2 - 2 * (s->arr[s->top].no - 1)*fv1;
    30. fv1 = fv2;
    31. fv2 = s->arr[s->top].val;
    32. s->top--;
    33. }
    34. return fv2;
    35. }
    36. int main() {
    37. Stack *s;
    38. //声明各类方法
    39. Stack *createStack(int);
    40. bool push(Stack *,Recursion *);
    41. bool full(Stack *);
    42. bool empty(Stack *);
    43. bool top(Stack *);
    44. bool pop(Stack *);
    45. int n, x;//题目所要用到的n和x
    46. int p;//用于接收结果
    47. printf("请输入n和x: \n");
    48. printf("n=");
    49. scanf("%d",&n);
    50. printf("x=");
    51. scanf("%d", &x);
    52. //创建大小为n的栈
    53. s = createStack(n);
    54. p=getP(s,n,x);
    55. printf("%d",p);
    56. return 0;
    57. }