递归的适用范围
- 代替多重循环
- 用递归解决递归形式的问题
- 用递归将问题分解为规模更小的子问题
汉诺塔问题
#include<iostream>
using namespace std;
void digui(int n,char a, char b, char c)
{
if (n == 1)
{
cout << a << "->" << c << endl;
return;
}
digui(n - 1, a, c, b);
cout << a << "->" << c << endl;
digui(n - 1, b, a, c);
}
int main()
{
digui(3, 'a', 'b', 'c');
return 0;
}
n皇后问题(用递归代替多重循环)
#include<iostream>
using namespace std;
int line[100], n;
void digui(int k)
{
if (k == n+1)
{
for (int i = 1; i <= n; i++)
{
cout << line[i] << " ";
}
cout << endl;
return;
}
int i,j;
for (i = 1; i <= n; i++)
{
for (j = 1; j <k ; j++)
{
if (line[j] == i||abs(line[j]-i)==abs(k-j))
break;
}
if (j == k)
{
line[k] = i;
digui(k + 1);
}
}
}
int main()
{
cin >> n;
digui(1);
}
波兰表达式(用递归解决递归形式的问题)
#include<iostream>
using namespace std;
double exp() {
char a[100];
cin >> a;
switch (a[0]) {
case '+':
return exp() + exp();
case '-':
return exp() - exp();
case '*':
return exp() * exp();
case '/':
return exp() / exp();
default:
return atof(a);
break;
}
}
int main() {
cout << exp();
}
爬楼梯(用递归将问题分解为规模更小的子问题)
#include<iostream>
using namespace std;
int digui(int n)
{
if (n == 1) return 1;
if (n == 2) return 2;
return digui(n - 1) + digui(n - 2);
}
int main()
{
int n;
while (cin >> n)
{
cout << digui(n) << endl;
}
}
放苹果
#include<iostream>
using namespace std;
int digui(int m,int n)
{
if (n > m)
return digui(m, m);
if (m == 0)
return 1;
if (n == 0)
return 0;
return digui(m, n - 1) + digui(m - n, n);
}
int main()
{
int t, m, n;
cin >> t;
while (t--)
{
cin >> m >> n;
cout << digui(m, n) << endl;
}
}