分析:
从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;
}