经典递归问题
递归需要满足 3 要素:
1、一个父问题可以拆分成若干个子问题,并且若干子问题的结果汇总起来就是父问题的答案。
2、父问题和子问题,解题思路必须完全一致,只是数据规模不同。
3、存在终止条件。
问题在不断拆分的同时,一定要在某个节点终止拆分,得到一个明确的答案。
问题一:假设有 n 个台阶,每次可以跨 1 个台阶或者 2 个台阶,请问走完这 n 个台阶一共有多少种走法?
1、假设有 1 个台阶,一共有(1) 种走法
2、假设有 2 个台阶,一共有 2 种走法 【1,1】【2】
3、假设有 3 个台阶,一共有()种走法?【1,1,1】【1,2】【2,1】
可以根据第一步的走法进行分类
第一类是第一步走了 1 个台阶
第二类是第一步走了 2 个台阶
所以 n 个台阶的走法就等于先走 1 个台阶后,n-1 个台阶的走法+先走 2 个台阶后,n-2 个台阶的走法。
f(n) = f(n-1)+f(n-2)
f(1) = 1,能否作为终止条件?
n = 2,f(2) = f(1)+f(0),如果终止条件只有一个 f(1) = 1,f(2) 就无法求解, 因为 f(0) 的值无法确定,
把 f(2) = 2 作为一个终止条件
终止条件有两个:
f(1) = 1;
f(2) = 2;
n = 3,f(3) = f(2)+f(1) = 3
n = 4,f(4) = f(3)+f(2) = 3 + 2 = 5
递推公式
f(1) = 1;
f(2) = 2;
f(n) = f(n-1)+f(n-2);
推导出递归代码
int f(int n){
if(n == 1) return 1;
if(n == 2) return 2;
return f(n-1) + f(n-2);
}
Java代码
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println(i+"个台阶共有"+f1(i)+"种走法");
}
}
public static int f1(int n){
if(n==1){
return 1;
}else if(n==2){
return 2;
}else {
return f1(n-1) + f1(n-2);
}
}
问题二:n!的计算
public static void main(String[] args) {
for (int i = 5; i < 10; i++) {
System.out.println(i+"的阶乘为:"+f2(i));
}
}
//递归
public static int f1(int n){
if(n==1){
return 1;
}else {
return f1(n-1)*n;
}
}
//循环
public static int f2(int n) {
if(n == 1) return 1;
int sum = 1;
for (int i = 1; i <= n ; i++) {
sum = sum * i;
}
return sum;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥