一个n边正三角形内有几个正三角形(面试题复盘)

题目: 一个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=1ndelta(ni)
所以求解delta(n)是关键

从中可以看出显然 △(delta(n_i)) 与 边长数i 有关。且有两部分组成,图中所示的上底和下底
在这里插入图片描述
这个计算有点类似图像池化的步长, i为正三角形的边长,1为步长
△ d o w n = n − ( i − 1 ) △_{down} = n - (i-1) down=n(i1)
n-i 是确定上底的位置
△ u p = n − i − ( i − 1 ) ( i f △ u p > = 0 ; 0 ) △_{up} = n-i- (i-1) (if △_{up}>=0 ;0) up=ni(i1)(ifup>=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个小的正三角形
"""

反思,这种题型,画图的时候一定要大张的纸, 一点点好好数。用递归能比较方便的解决一些问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值