zoukankan      html  css  js  c++  java
  • 不会递归?五道例题教你如何递归

    递归的适用范围
    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;
    	}
    }
    
    
  • 相关阅读:
    C#基础 const和readonly关键字
    C#基础 base与this关键字
    ASP.NET Web Form 与 ASP.NET MVC 区别
    qt 零星笔记
    我应该记录一下我不太了解的一些c语言函数
    Linux学习书籍推荐
    更改arch的默认终端
    让arch阻止某个软件包的升级
    python pachong zhuanzai
    从贴吧看的逆向网络协议过程逆向校园网客户端
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13811938.html
Copyright © 2011-2022 走看看