题目: 一个n边正三角形内有几个正三角形
一、分析题目
这题首先的思想是递归。
对于递归的推演参考下图
一个n边正三角形内有几个正三角形的个数
y=y_n-1+delta(n)
d e l t a ( n ) = ∑ i = 1 n d e l t a ( n i ) delta(n) = \sum_{i=1}^n{delta(n_i)} delta(n)=i=1∑ndelta(ni)
所以求解delta(n)
是关键
从中可以看出显然 △(delta(n_i)
) 与 边长数i 有关。且有两部分组成,图中所示的上底和下底
这个计算有点类似图像池化的步长, i为正三角形的边长,1为步长
△
d
o
w
n
=
n
−
(
i
−
1
)
△_{down} = n - (i-1)
△down=n−(i−1)
n-i
是确定上底的位置
△
u
p
=
n
−
i
−
(
i
−
1
)
(
i
f
△
u
p
>
=
0
;
0
)
△_{up} = n-i- (i-1) (if △_{up}>=0 ;0)
△up=n−i−(i−1)(if△up>=0;0)
△
=
△
u
p
+
△
d
o
w
n
△ = △_{up} + △_{down}
△=△up+△down
基于上述我们可以写出delta(n_i)
的python小片段
def delta_n_i(n, i):
down_ = n -(i-1)
up_ = n - i -(i-1) if n - i -(i-1)>=0 else 0
delta_n_i_value = down_ + up_
return delta_n_i_value
for i in range(1, 6):
print(f'边长为{i}时在边长为5的正三角形中需要增加',delta_n_i(5, i))
"""
边长为1时在边长为5的正三角形中需要增加 9
边长为2时在边长为5的正三角形中需要增加 6
边长为3时在边长为5的正三角形中需要增加 3
边长为4时在边长为5的正三角形中需要增加 2
边长为5时在边长为5的正三角形中需要增加 1
"""
二、解题
def n_triangle(n):
"""
param n: 大正三角形的边长
"""
if n==0:
return 0
add_ = 0
for i in range(n, 0, -1):
add_ += delta_n_i(n , i)
return add_ + n_triangle(n-1)
# 两个合并起来就是
def n_triangle_(n):
"""
param n: 大正三角形的边长
"""
if n==0:
return 0
add_ = 0
for i in range(n, 0, -1):
down_ = n -(i-1)
up_ = n - i -(i-1) if n - i -(i-1)>=0 else 0
add_ = down_ + up_
return add_ + n_triangle(n-1)
for i in range(1, 7):
print(f'{i}边正三角形中有{n_triangle(i)}个小的正三角形')
"""
1边正三角形中有1个小的正三角形
2边正三角形中有5个小的正三角形
3边正三角形中有13个小的正三角形
4边正三角形中有27个小的正三角形
5边正三角形中有48个小的正三角形
6边正三角形中有78个小的正三角形
"""
反思,这种题型,画图的时候一定要大张的纸, 一点点好好数。用递归能比较方便的解决一些问题