递归总结。

喜夏-厌秋 提交于 2020-03-01 16:05:11

递归的话就是在函数内部调用函数,这类题都是有一定的关联关系的。
递归的关键在于找出递归定义递归终止条件。

例题一:

集合的全排列问题
例如输入 123
样例输出:
123
132
213
231
321
312

#include<iostream>
#include<cstring>
using namespace std;
void f(char a[], int k, int m) 数组,排列的起始下标,最后的的元素下标。
{
	if (k == m)如果排到最后了,就输出结果
	{
		for (int i = 0; i <= m; i++)
			cout << a[i]; cout << endl;
	}
	else
		for (int i = k; i <= m; i++)
		{
			swap(a[i], a[k]);
			f(a, k + 1, m);
			swap(a[i], a[k]);就是回溯。
		}
}
int main()
{
	char b[28]; cin >> b; char a[27];
	int m = strlen(b) - 1;
	for (int i = 0; i <= m; i++)
		a[i] = b[i];
	f(a, 0, m);
}

例题二

半数集问题!
在这里插入图片描述

只写调用的函数。
int comp(int n)
{
	int a = 1;//a是计数的变量
	if (n > 1)//等于1的就不用再去分了啊!
		for (int i = 1; i <= n / 2; i++)
			a = a + comp(i);
	return a;
}

感觉这个题和 “2的幂次方表示” 挺相似的。
都是看每次分出来的数 能不能再分,如果还能再分那就继续,否则结束,进行下一次的分 数
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7=22+2+20(21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210+28+25+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入
一个正整数n(n≤20000)。
输出
一行,符合约定的n的0,2表示(在表示中不能有空格)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iomanip>
using namespace std;
int a[16], n;
void f(int k)
{
	int i;
	for (i = 14; i >= 0; i--)
		if (a[i] <= k) break;
	if (i == 0) cout << "2(0)";//题目规定能显示0,1,2次幂,所以三个单独写。
	else if (i == 1) cout << "2";
	else if (i == 2) cout << "2(2)";
	else
	{
		cout << "2(";
		f(i);
		cout << ")";
	}
	if (a[i] < k)//上边的都是第一个大数的幂的表示 万一这个大数<k那么就得输出加号了 然后在进行运算。
	{
		cout << "+";
		f(k - a[i]);
	}
}
int main()
{
	a[0] = 1;
	cin >> n;
	for (int i = 1; i <= 15; i++)//表示2的n次方
		a[i] = a[i - 1] * 2;
	f(n);
	
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!