递归的话就是在函数内部调用函数,这类题都是有一定的关联关系的。
递归的关键在于找出递归定义和递归终止条件。
例题一:
集合的全排列问题
例如输入 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);
}
来源:CSDN
作者:我是个菜鸡小白.
链接:https://blog.csdn.net/weixin_45988242/article/details/104591279