慕课地址:
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;
}
- 一个数是逆波兰式,值为该数字(递归终止条件)
- ” 运算符 逆波兰表达式 逆波兰表达式“ 可以一直递归