从蓝桥杯真题 煤球数目 而来---算法之递推

煤球数目

有一堆煤球,堆成三角棱锥形。
具体:第一层放1个,
第二层3个(排列成三角形),
第三层6个(排列成三角形),
第四层10个(排列成三角形),

如果一共有100层,共有多少个煤球?
请填表示煤球总数目的数字。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字

解析:

由每一层的数目可分析得

第一层 :1个
第二层 :3个,也就是,第一层的1个+层数2 = 3个
第三层 :6个,也就是,第二层的3个+层数3 = 6个
第四层 :10个。也就是,第三层的6个+层数4 = 10个
……
……
第一百层的个数等于,第99层的个数+层数100

而由题意可依次从1,2,3推到99,100的每层的层数,然后再相加即可得到答案

代码思路为:

首先,从第1层到100层,依次推得每一层的煤球数;

然后,可以选择先将每一层的的煤球数保存到数组中,在遍历该数组把每一层的谋球数加上。

也可以在依次递推得到每一层的煤球个数时,就累加上。

代码:

public class EggetteNum {
	public static void main(String[] args) {
		//累加得计数器
		int count = 0;
		//从1下表开始,放每一层得煤球数得数组
		int[] nums = new int[101];
		//从第二层开始递推得到每一层得煤球数,并存入数组中
		for (int i = 1; i <= 100; i++) {
			if(i == 1) {//第一层直接为1
				nums[1] = 1;
			}else {
				nums[i] = nums[i-1] + i;
			}
		}
		//将每一层得煤球数累加
		for (int i = 0; i < nums.length; i++) {
			count += nums[i];
		}
		System.out.println(count);
	}
}

结果:

171700

上面解题得方法为,递推。下面来看看什么是递推,以及该怎么用。

递推

递推算法是根据已有的数据和关系,逐步推导而得到结果。递推算法的执行过程如下:

(1)根据已知结果和关系,求解中间结果。

(2)判定是否达到要求,如果没有达到,则继续根据已知结果和 关系解中间结果。如满足要求,则表示找到

一个只正确答案。

例题:

如果一对两个月大的兔子以后每一个月都可以生一对小兔子,而一对新兔子出生两个月后才可以生小兔子。也就是说,1月份出生,3月份才可以生小兔子。那么假设一年内没有兔子失亡,那么1年后共有多少对兔子?

分析:

第一个月:1对兔子;原始那对兔子。
第二个月:1对兔子;原始那对兔子。
第三个月:2对兔子;是原来的一对兔子加刚生出来的那对兔子。
第四个月:3对兔子;原始的那对兔子+刚生出来一个月的那对兔子+刚出生的一对兔子。
第五个月:5对兔子;原始的那对兔子+出生两个月的那对兔子+出生一个月的那对兔子+原始那对刚出生的一对兔子+已经出生两个月刚生出的一对兔子。
……

由第三个月可以看出,

当月总的兔子的对数为,前两个月的兔子的对数的和,即:Fn = Fn-1+Fn2(n>=3).

从而可以由前面已知的数据递推得到后面的数据。

代码:

public class RabbitNum {
	public static void main(String[] args) {
		//定义一个存放每一个月的兔子的对数的数组,从下表为一开始放
		int[] r = new int[13];
		//初始化前两个月的兔子数,因为递推公式是从第三个月开始的
		r[1] = 1;
		r[2] = 1;
		//依次算除每一个与月的兔子对数,并放入对应的数组空间中
		for (int i = 3; i <= 12 ; i++) {
			r[i] = r[i-1]+r[i-2];
		}
		//答应目标月份对应的兔子对数
		System.out.println(r[12]);
	}
}

结果:
144

递推的思路很符合我们的思维逻辑。所以应该很好理解。故以后碰到此类的题时,应该仔细观察相邻的数据

之间的关系。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值