C语言每日一练——第90天,JSP程序设计教程(第2版)

本文讨论了青蛙跳阶问题的递归解法及其存在的大量重复计算问题,提出通过动态规划优化算法,避免重复计算,给出了两种改进后的代码实现。
摘要由CSDN通过智能技术生成

f

(

6

)

f(6)

f(6),就需要先计算出子问题

f

(

5

)

f(5)

f(5) 和

f

(

4

)

f(4)

f(4)
 
然后要计算

f

(

5

)

f(5)

f(5),又要先算出子问题

f

(

4

)

f(4)

f(4) 和

f

(

3

)

f(3)

f(3),以此类推。
 
一直到

f

(

2

)

f(2)

f(2) 和

f

(

1

)

f(1)

f(1),递归树才终止。
 
因此,青蛙跳阶,递归解法的时间复杂度 等于

O

(

1

)

O

(

2

n

)

=

O

(

2

n

)

O(1) * O(2^n) = O(2^n)

O(1)∗O(2n)=O(2n)在这里插入图片描述
你仔细观察这颗递归树,你会发现存在「大量重复计算」;
 
比如

f

(

4

)

f(4)

f(4)被计算了两次,

f

(

3

)

f(3)

f(3)被重复计算了3次…所以这个递归算法低效的原因,就是存在大量的重复计算!

所以我们可以对代码进行优化

🍅 递归升级

在递归法的基础上,新建一个长度为

n

n

n 的数组,用于在递归时存储

f

(

0

)

f(0)

f(0) 至

f

(

n

)

f(n)

f(n) 的数字值,重复遇到某数字时则直接从数组取用,避免了重复的递归计算。
 
所以我们设置一个数组,用于存放第一次计算某一个

n

n

n的jump(n)
 
当每一次要计算一个jump(n)的时候,就先查看数组中以

n

n

n 为下标的地方是否有值,有的话就可以不调用jump(n),而直接从数组中取得结果值,否则再计算jump(n)

📝代码实现

#include <stdio.h>

long int f[1000]={0};
int jump(int n){
//当只有一阶台阶的时候,只有一种上台阶的方式。

//当有2阶台阶的时候,有2种上台阶的方式,一种是一次上一阶,还有一种是一次上2个台阶。

//现在设有n阶台阶,如果n>2,那种应该有&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值