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


    递归的适用范围
    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;
    	}
    }
    
    
  • 相关阅读:
    POJ 1182 食物链(带权并查集)
    UVa 10655 n次方之和(矩阵快速幂)
    2016湘潭邀请赛—Heartstone
    2016湘潭邀请赛—Gambling
    UVa 10375 选择与除法(唯一分解定理)
    UVa 1637 纸牌游戏(全概率公式)
    POJ 2443 Set Operation(压位加速)
    UVa 11248 网络扩容(最大流(需要优化))
    51Nod 1737 配对(树的重心)
    51Nod 1070 Bash游戏 V4(斐波那契博弈)
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13811938.html
Copyright © 2020-2023  润新知