1106
多重条件画图辅助,条件尽量简洁
if(a<=18){
}
else if(a<=31){
}
else if(a<=65){
}
else{
}
进行除法时,整数/整数的结果还是整数,即使赋值给double,也无法正确计算,需要提前改成小数
有百分号的输出,注意百倍关系
printf 中 double 对应的是lf
~~~~~~~~~~~~~~~
递归函数:自己调用自己
递归函数必备:1、递归规律,2、结束条件
循环求斐波那契数列第40项,前两项是1
int f[50]={0,1,1};
int f1=1,f2=1;
for(int i=3;i<50;i++){
f[i]=f1+f2;
f1=f2;
f2=f[i];
}
cout<<f[40];
递归推导(正向)
1、列出数据,观察规律
n=1 1
n=2 1
n=3 2
n=4 3
n=5 5
n=6 8
n=7 13
...列出8~20项
n=n n-1 + n-2
2、将规律写成公式
当求的是第n项的时候,f(n)=f(n-1)+f(n-2)
第n项与n-x项的关系
3、列出特殊情况
这里n-1和n-2不能小于等于0,所以n=1和n=2是特殊情况
n=1 f(1)=1
n=2 f(2)=2
4、写代码
int f(int n){
if(n==1) return 1;
if(n==2) return 1;
return f(n-1)+f(n-2);
}
向下运行是递,返回路径是归
递归的运行过程很复杂,本代码中涉及到的运行规律是一分二,所以运行时间成2^n增长
递归因为运行较慢,因此不适用于数据层数多的题目
已知一栋楼有n级楼梯,每次可以爬1级或2级
输入n,输出一共有多少种爬法
n=5 8
n=8 34
递归推导(逆向)
n级楼梯一共有f(n)种爬法
最后一步爬的是1级,有f(n-1)种爬法
最后一步爬的是2级,有f(n-2)种爬法
f(n)=f(n-1)+f(n-2)
汉诺塔
把最大的挪到目标柱上去
最大的上面的要挪到过渡柱上
最大的挪到目标上
把其他的挪到目标上
void hn(int n,char a,char b,char c){
if(n==1) printf("把%d从%c挪到%c上面
",n,a,c);
else{
hn(n-1,a,c,b);
printf("把%d从%c挪到%c上面
",n,a,c);
hn(n-1,b,a,c);
}
}
全排列
输入:
ABC
输出:
ABC
ACB
BAC
BCA
CAB
CBA
以各个字符作为开头,然后排列剩下的
string str;//abcde
void pai(int s,int e){
if(s==e) {
cout<<str<<endl;
return ;
}
for(int i=s;i<=e;i++){
swap(str[i],str[s]);
pai(s+1,e);
//swap(str[i],str[s]);//是否需要还原,取决于主串的等级,如果不是全局,需要还原,是全局不需要
}
}
相关文档:https://noicode.online/a/hanshu/20240510/183.html
一本通题目范围:
c++语法-第六章递归算法
基础算法-第四章递归算法
1156题
bool cmp(int a,int b){//比较的主体
return a>b;//什么情况下a在b前边
}
int a[10]={1,2,3,4,5,6,7,8,9,10};
sort(a+3,a+7+1,cmp);
//默认从小到大
//参数:数据开头地址,数据结尾地址+1,规则
1 2 3 8 7 6 5 4 9 10
(责任编辑:admin) |