You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:22:33