编写R/Python指数聚合函数实现指定计算逻辑
实现指定指数聚合逻辑的R和Python函数
先拆解下需求里的计算规则,帮我们找到更高效的实现思路:
- 第一个元素直接保留输入值
- 对于第
k个元素(k ≥ 2),它等于输入的第k个值乘以一个等比数列的和:这个数列是exp(-0.04)的1次方、2次方……直到k-1次方的总和。
我们可以用等比数列求和公式来替代循环累加,提升计算效率:
对于公比
r,前m项和为r*(1 - r^m)/(1 - r),这里r = exp(-0.04),m = k-1
下面分别给出R和Python的实现:
R 实现
exponential_aggregate <- function(input_arr) { # 定义公比r,避免重复计算 r <- exp(-0.04) # 初始化结果数组,长度与输入一致 result <- numeric(length(input_arr)) # 第一个元素直接保留输入值 result[1] <- input_arr[1] # 从第二个元素开始遍历计算 for (k in 2:length(input_arr)) { m <- k - 1 # 用等比数列公式计算求和项 sum_geo <- r * (1 - r^m) / (1 - r) # 计算当前元素并保留两位小数 result[k] <- round(input_arr[k] * sum_geo, 2) } return(result) } # 测试示例输入 input <- c(10, 20, 30, 40, 50) # 调用函数 exponential_aggregate(input) # 输出结果:[1] 10.00 19.21 56.51 110.83 181.14
逻辑说明
- 提前计算公比
r,减少重复运算 - 利用等比数列求和公式替代逐次累加,比循环相加更高效
- 最后用
round函数保留两位小数,和示例输出格式一致
Python 实现
import math def exponential_aggregate(input_arr): # 定义公比r r = math.exp(-0.04) # 初始化结果列表 result = [0.0] * len(input_arr) # 第一个元素直接赋值 result[0] = input_arr[0] # 从第二个元素(索引1)开始遍历 for idx in range(1, len(input_arr)): # Python索引从0开始,对应原问题的第idx+1个元素,所以m = (idx+1)-1 = idx m = idx # 计算等比数列前m项和 sum_geo = r * (1 - r**m) / (1 - r) # 计算当前元素并保留两位小数 result[idx] = round(input_arr[idx] * sum_geo, 2) return result # 测试示例输入 input_list = [10, 20, 30, 40, 50] # 调用函数并打印结果 print(exponential_aggregate(input_list)) # 输出结果:[10, 19.21, 56.51, 110.83, 181.14]
逻辑说明
- 注意Python的索引从0开始,所以遍历索引
idx对应原问题的第idx+1个元素,求和项的项数m等于当前索引值 - 同样使用等比数列求和公式,避免冗余的累加操作
- 用
round函数控制小数位数,匹配示例输出要求
内容的提问来源于stack exchange,提问作者Sona
相关产品推荐
相关产品推荐

