递归
例题1:集合的划分
代码:
#include<iostream>
using namespace std;
long long dfs(int n,int k){
if(n<k||k==0) return 0;
if(n==k||k==1)return 1;
return dfs(n-1,k-1)+k*dfs(n-1,k);
}
int main(){
int n,k;
cin>>n>>k;
cout<<dfs(n,k);
return 0;
}
【题目解析】
在放第n个数时有两种情况,一为并入前面k个集合中,情况有k*dfs(n-1,k)种,二为自成一个集合,情况为dfs(n-1,k-1)种,所以所有的情况就为dfs(n-1,k-1)+k*dfs(n-1,k)种。
例题2:逆波兰表达式
代码:
#include<iostream>
#include<iomanip>
#include<bits/stdc++.h>
using namespace std;
char a[10010];
double f(){
scanf("%s",&a);
if(a[0]=='*')return f()*f();
else if(a[0]=='/')return f()/f();
else if(a[0]=='+')return f()+f();
else if(a[0]=='-')return f()-f();
else{
return atof(a);
}
}
int main(){
cout<<fixed<<setprecision(6)<<f();
return 0;
}
【题目解析】
通过定义没有参数的函数来获取输入并对输入进行操作,分别对读入的字符型数据进行处理,如果为符号则不断向后层递归,如果为数字则利用atof函数转换为浮点型数据再进行运算。
补充拓展:
atof与atoi:
头文件:#include<stdlib.h>
atof(字符数据)——》double双精度浮点数据
atoi(字符数据)——》int整型数据
例题3:全排列(字母)
代码:
#include<iostream>
using namespace std;
string a,b;
int k;
bool vis[10];
void dfs(int m){
if(m==k){
for(int i=0;i<k;i++){
cout<<b[i];
}
cout<<endl;
}
el