不会递归?五道例题教你如何递归

递归的适用范围
  1. 代替多重循环
  2. 用递归解决递归形式的问题
  3. 用递归将问题分解为规模更小的子问题
汉诺塔问题
#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;
	}
}

原文地址:https://www.cnblogs.com/Hsiung123/p/13811938.html