北大mooc 程序设计与算法(二)算法基础 第二章递归(一)

慕课地址:

https://www.icourse163.org/course/PKU-1001894005

递归(一)

汉诺塔

样例输入:

盘子数目n ( n < 8)

3

样例输出:

移动方案

A->C
A->B
C->B
A->C
B->A
B->C 
A->C
#include <iostream>
using namespace std;

void Hanoi(int n, char left, char mid, char right)
// 将left上的n个盘子,从最左边移到最右边,mid中转
{
    if (n == 1)
    { // 只需移动一个盘子时,直接输出
        cout << left << "->" << right << endl;
        return; // 递归终止
    }
    // 将n-1个盘子从 left 移动到mid
    Hanoi(n - 1, left, right, mid);
    // 将最后一个盘子从left 移动到 right
    cout << left << "->" << right << endl;
    // 再将n-1个盘子从mid移动到right
    Hanoi(n - 1, mid, left, right);
    return;
}
int main()
{

    int n;
    cin >> n;

    Hanoi(n, 'A', 'B', 'C');

    return 0;
}

N皇后

样例输入:

一个整数N,表示要把N个皇后摆放在一个N行N列的国际象棋棋盘上

4

样例输出:

所有的摆放放案。每个方案一行,依次是第0行皇后位置、第1行皇后位置…第N-1行皇后位置。
多种方案输出顺序如下:优先输出第0行皇后列号小的方案。如果两个方案第0行皇后列号一致,那么优先输出第1行皇后列号小的方案…以此类推

1 3 0 2 
2 0 3 1 
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int N;
int queenPos[100]; // 用于存放

void NQueen(int k); // 摆放第k行的皇后,0 - k-1 已经成功摆放

int main()
{
    cin >> N;
    NQueen(0);
    return 0;
}

void NQueen(int k)
{ // 摆放第k行的皇后,0 - k-1 已经成功摆放

    if (k == N) // N个皇后已经摆好了
    {           // k已经到达N 输出i行的每个的皇后的列数
        for (int i = 0; i < N; i++)
        {
            cout << queenPos[i] << " ";
        }
        cout << endl;
        // cout << 1 << endl;
    }

    for (int i = 0; i < N; i++) // 遍历第i列
    {
        int j;
        for (j = 0; j < k; j++) // 行
        {
            // 判断比较是否能否存放皇后
            if (queenPos[j] == i || abs(i - queenPos[j]) == abs(k - j)) // 不在同一行且 行差 列差不相等(不为与于对角线)
            {
                break;
            }
        }

        if (j == k)
        {
            queenPos[k] = i;
            NQueen(k + 1);
        }
    }
}

逆波兰表达式

样例输入:

输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

* + 11.0 12.0 + 24.0 35.0

样例输出:

输出为一行,表达式的值。
可直接用printf(“%f\n”, v)输出表达式的值v。

1357.000000
#include <iostream>
#include <cstdio>
#include <cstdlib>

using namespace std;

double exp()
{	// 读入一个逆波兰表达式 并计算该值
    char s[20];
    cin >> s;		// 

    switch (s[0])
    {
    case '+':
        return exp() + exp();
    case '-':
        return exp() - exp();
    case '*':
        return exp() * exp();
    case '/':
        return exp() / exp();
    default:
        return atof(s);

        break;
    }
}
int main()
{

    printf("%lf\n", exp());
    return 0;
}
  • 一个数是逆波兰式,值为该数字(递归终止条件)
  • ” 运算符 逆波兰表达式 逆波兰表达式“ 可以一直递归
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值