递归学习(1)
1.递归学习(1)
2.递归优化策略(记忆化)·递归的特点是函数调用它自己本身。其中直接调用自己称为直接递归,而将a调用b,b又调用a的递归叫间接递归。
eg1 1201:菲波那契数列
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数是多少。
#include<bits/stdc++.h> using namespace std; int f(int m){ if(m==1) return 1;//数列的第一个数为1 else if(m==2) return 1;//数列的第一个数为2 else return f(m-1)+f(m-2);//其它每个数等于前两个数字之和 } int main(){ int n,a[10005]; cin>>n; for(int i=1; i<=n; i++) cin>>a[i]; for(int i=1; i<=n; i++) cout<<f(a[i])<<endl;//调用 return 0; }
·递归要素:1.拆解复杂问题至一个或几个重复的简单步骤(如上题“每个数等于前两个数之和”)
2.以特殊情况作为返回的点(否则程序死循环)
·个人认为重点在于分析与拆解问题,从头到尾再从尾到头理解路径
eg2 1315:【例4.5】集合的划分
#include<bits/stdc++.h> using namespace std; long long f(long long n,long long k){ if(n<k || k==0){ return 0; }else if(n==k){ return 1; }else if(k==1){ return 1;//分析特殊情况 }else return f(n-1,k-1)+k*f(n-1,k);//一般情况下的总类数 } int main(){ long long n,k; cin>>n>>k; cout<<f(n,k)<<endl; return 0; }//数据大时记得用long long()
eg3 1204:爬楼梯
树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。
例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3种方法。
#include<bits/stdc++.h> using namespace std; int f(int n){ if(n==1) return 1;//一阶楼梯一种走法 else if(n==2) return 2;//两阶楼梯两种走法 else return f(n-1)+f(n-2);//一般情况楼梯总走法数是前一阶总走法+前两阶总走法(因为要么走一阶要么走两阶) } int main(){ int n; while(cin>>n){ cout<<f(n)<<endl; } return 0; }
eg4 1316:【例4.6】数的计数(Noip2001)
我们要求找出具有下列性质数的个数。先输入一个自然数,然后对此自然数按照如下方法进行处理:不作任何处理;在它的左边加上一个自然数,但该自然数不能超过原数的一半;加上数后,继续按此规则进行处理,直到不能再加自然数为止。
(超时版代码)
#include<bits/stdc++.h> using namespace std; int n; int s=0; void ss(int t){ for(int m=1; m<=t/2; m++){ s++; if(m>=2)//尝试优化未遂 { ss(m); } } } int main(){ cin>>n; ss(n); cout<<s+1<<endl;//加上自己 return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义