案例五:三角形的个数

分析:

从n-1层的三角形,在下面增加一层三角形,变成n层的三角形,会多出多少个三角形?
假设n层三角形,所有三角形的个数为f(n)。要实现从f(n-1)递推到f(n)
为了求f(n),可以在f(n-1)的基础上,加上多出来的三角形 

首先第n层三角形是多出来的,有2*n-1个。其次,以第n层三角形底边为下底的、高度为2层的三角形有n-1个,如图(a)所示;以第n层三角形底边为下底的、高度为3层的三角形有n-2个,如图(b)所示,……。易知这些多出来的三角形其实就是1+2+3+…+(n-1)=n*(n-1)/2 

此外,当n≥4时,还有新增的倒立三角形
从f(n-1)递推到f(n),只能加上多出来的倒立三角形,即以第n层三角形为顶点的倒立三角形 

如下图所示,以第n层三角形为顶点,高度为2层的倒立三角形,个数是n-2-1;高度为3层的倒立三角形,个数是n-3-2;以此类推,这是一个首项为n-3,公差为-2的等差数列。如果n为奇数最后一项为2,如果n为偶数,则最后一项为1

可以用while循环求这个等差数列的和也容易推导出公式:如果n为奇数,这个等差数列的和是(n-3)*(n-2)/2;如果n为偶数,这个等差数列的和是(n-4)*(n-2)/2

根据上述分析,可以用递归函数求f(n),递归函数结束的条件是f(1) = i

此外,也可以推导出直接求f(n)的公式
易知,f(n)=f(n-1)+(2*n-1)+n*(n-1)/2+g(n),f(1)=1
根据上述公式,可以推导出求f(n)的公式


所以,本题也可以直接根据上述公式求解 

#include<iostream>
using namespace std;
int f(int n){ //求有n层三角形时各种三角形的个数 
	if(n==1) return 1;
	int cnt = f(n-1);
	cnt += 2*n-1; //第n层小得三角形个数 
	cnt += n*(n-1)/2; //第n层为底边的大的三角形的个数 
	int k = n-3; //以n层三角形为顶点,高度为n层的倒立三角形的个数 
	while(k>0){
		cnt+=k; k-=2;
	} 
    return cnt;
}
int main()
{
	int n; cin >> n;
	cout << f(n) << endl;
    return 0;
}
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值