13_递归与栈

【目录】

一、 用栈实现递归 2
二、 双层递归转栈 4
三、 栈模拟递归函数调用 5

一、用栈实现递归

#include<stack>
#include <iostream>
using namespace std;
/*利用递归实现1.2.3......n的排列输出*/
int printN(int n)
{
    if (n>0)
    {
        cout << n;
        return printN(n - 1);
    }
}
/*利用栈实现1.2.3......n的排列输出*/
void printNS_shunxu(int n)
{
    stack<int>  mystack;
AAA:
    if (n > 0)
    {
        mystack.push(n);
        while (!mystack.empty())
        {
            cout << mystack.top();
            mystack.pop();
        }

        n -= 1;
        goto AAA;
    }
}
/*自己改进:利用栈实现1.2.3......n的排列输出*/
void printNS_shunxu(int n)
{
    stack<int>  mystack;
    while( n != 0 || !mystack.empty() ){ 
        if( n!=0 ) {
            mystack.push( n-- ) ;
        }
        if( !mystack.empty() ){
            cout << mystack.top() << " " ;
            mystack.pop() ;
        }
    }
}
void printNS_nixu(int n)
{
    stack<int>  mystack;
    while( n!=0 || !mystack.empty() ) {
        while( n!=0 ) {
            mystack.push( n-- ) ;
        }
        while( !mystack.empty() ){
            cout << mystack.top() << " " ;
            mystack.pop() ;
        }
    }
}
void printNS_nixu(int n)
{
    stack<int>  mystack;
AAA:
    if (n > 0)
    {
        mystack.push(n);


        n -= 1;
        goto AAA;
    }
    while (!mystack.empty())
    {
        cout << mystack.top();
        mystack.pop();
    }
}
/*递归:实现1到n之间的累加*/
int get100(int i)
{
    if (!i)
    {
        return 0;
    } 
    else
    {
        return get100(i - 1) + i;
    }
}
/*栈:实现1到n之间的累加*/
int getN(int i)
{
    stack<int>  mystack;
    int res = 0;
AA: if (i)
    {
        mystack.push(i);
        i--;
        goto AA;
    }
    while (!mystack.empty())
    {
        res += mystack.top();
        mystack.pop();
    }
    return res;
}
void to2(int num)
{
    if (num)
    {
        cout << num % 2;
        to2(num / 2);
    }
}
void main ()
{
    cout << get100(100) << endl;
    printNS_nixu(9);
    printNS_shunxu(9);

    cout<<"\n"<<getN(100)<<"\n";

    to2(10);

    cin.get();  
}

二、双层递归转栈

#include<iostream>
#include <stack>
using namespace std;
/*递归实现斐波那契序列*/
int getF(int n)
{
    if (n==1 ||n==2)
    {
        return 1;
    } 
    else
    {
        return getF(n - 1) + getF(n - 2);
    }
}
/*数组实现斐波那契序列*/
int GetFF(int n)
{
    int  *p = new int[n];
    p[0] = p[1] = 1;
    for (int i = 2; i < n;i++)
    {
        p[i] = p[i - 1] + p[i - 2];
    }
    return p[n - 1];
}
/*栈实现斐波那契序列*/
int GetFFF(int n)
{
    stack<int>  mystack;

    int f1, f2, f3;
    f1 = f2 = 1;
    int i = 2;
ABC:
    if (i<n)
    {
        mystack.push(f1);
        mystack.push(f2);
        f3 = 0;
        while (!mystack.empty())
        {
                f3+= mystack.top();
                mystack.pop();
        }
        //f3 = f2 + f1;
        f1 = f2;//轮替
        f2 = f3;
        i++;
        goto ABC;
    }
    return  f3;
}
/*for循环轮替实现斐波那契序列*/
int GetFFFF(int n)
{
    int f1, f2, f3;
    f1 = f2 = 1;
    for (int i = 2; i < n; i++)
    {
        f3 = f2 + f1;
        f1 = f2;//轮替
        f2 = f3;
    }
    return  f3;
}
void main()
{
    cout << getF(10) << endl;
    cout << GetFF(10) << endl;
    cout << GetFFF(10) << endl;

    cin.get();
}

三、栈模拟递归函数调用

#include<iostream>
#include <stack>
//递归,有顺序,逆序,栈吃一个吐一个,顺序,一次吃完再吐,逆序
//递归,数据保留中间结果,函数指针保留操作
//汉诺塔,斐波那契数列  递归计算表达式  ,栈,
using namespace std;
void printN(int n)
{
    if (n > 0)
    {
        cout << n;
        return printN(n - 1);
    }
}
struct datas
{
    int n;
    void(*p)(int);
};

void print(int n)
{
    cout << n;
}
//1+100
void printall(int n)
{
    stack<datas>  mystack;
AAA:
    if (n > 0)
    {
        datas s1;
        s1.n = n;
        s1.p = print;
        mystack.push(s1);
        while (!mystack.empty())
        {
            datas stemp = mystack.top();
            stemp.p(stemp.n);
            mystack.pop();
        }
        n -= 1;
        goto AAA;
    }
}
void main()
{
    printall(10);

    cin.get();
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值