欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class07 mfy 笔记 递归函数

时间:2024-05-25 19:52 作者:admin 点击:
1106多重条件画图辅助,条件尽量简洁if(a=18){}else if(a=31){}else if(a=65){}else{}进行除法时,整数/整数的结果还是整数,即使赋值给double,也无法正确计算,需要提前改成小数有百分号的输出
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)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%