汉诺塔,逆波兰表达式,苹果放置递归实现

本文详细介绍了汉诺塔问题的解决方法,通过递归函数实现盘子移动;同时解释了逆波兰表达式的概念及其计算过程,采用递归方式实现了表达式的求值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 汉诺塔问题:

    问题描述:有三个柱子A,B,C,现在需要将柱子A上面n个由小到大放置的盘子移到柱子C上,移动规则是:每次只能移动一个盘子,盘子放置只能是大盘子在下面,小盘子在上面。

// n带表盘子的数目,
// fromPeg是n盘子最初所在的柱子
// auxPeg是中间用于借助移动的柱子
// toPeg是最终n盘子需要全部放上去的柱子
void Tower(int n, char fromPeg, char auxPeg, char toPeg)
{
    if (n == 1)     // 当盘子数目为1,直接移动
    {
        cout << "Move Disk 1 from Peg " << fromPeg << "to Peg " << toPeg << endl;
        return;
    }
    Tower(n - 1, fromPeg, toPeg, auxPeg);   // 先把fromPeg上n-1个柱子,借助toPeg移动到auxPeg
    cout << "Move Disk " << n << " from Peg " << fromPeg << "to Peg " << toPeg << endl; // 从fromPeg移动第n个圆盘到toPeg上
    Tower(n - 1, auxPeg, fromPeg, toPeg);   // 把auxPeg上n-1个柱子,借助fromPeg移动到toPeg
}

2. 逆波兰表达式

    逆波兰表达式的定义:每一运算符都置于其运算对象之后,故称为后缀表示。

    比如中缀表达式为:(12 + 36) / (1+3) * (15 - 8), 对应的逆波兰表达式为:* / + 12 36 + 1 3 - 15 8

// 逆波兰表达式的计算(递归实现)
// 输入 * / + 12 36 + 1 3 - 15 8
// 输出 48
double Notation()
{
    char str[10];
    cin >> str;
    switch(str[0])  // 获取输入的第一个字符,对应运算符的处理
    {
    case '+':
        return Notation() + Notation();
    case '-':
        return Notation() - Notation();
    case '*':
        return Notation() * Notation();
    case '/':
        return Notation() / Notation();
    default:
        return atof(str);   // 返回最终结果
    }
}

3. m个苹果放置在n个盘子的不同方法

    要求:不能有重复的,比如:三个盘子放7个苹果,若按照1,1,5和 5,1,1放置,为相同放置方法

int Methods(int m, int n)
{
    if (m <= 1 || n <= 1)   // 盘子或者苹果数目不超过1个,返回1
        return 1;
    else if (m < n)         // 当苹果的个数小于盘子的个数,等价于Metheds(m,m)
        return Methods(m, m);
    else
        return Methods(m, n-1) + Methods(m - n, n); // 否则,结果为:1个盘子为空,m个苹果放置n-1盘子的情况和至少每个盘子放了一个苹果的情况之和
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值