R语言不调用cumsum实现向量累积和自定义函数方法
R语言无内置cumsum的自定义累积和函数实现
原有代码问题梳理
- 循环变量错误:
for (i in x)是直接遍历x内的元素值,并非遍历向量的位置索引,累积和计算需要按位置从前往后递推,应遍历位置序列1:length(x) - 子集取法错误:R中提取向量从起始到结束位置的子集语法是
x[start:end],原有代码写的x[1]:x[i]是拿x[1]的数值和x[i]的数值生成整数序列,和取子集的逻辑完全不符 - 返回逻辑错误:逐次用
print()打印值不会生成和输入等长的结果向量,函数需要将每一步计算的结果存入预定义的向量,最终统一返回
实现思路
- 先做入参合法性校验,拦截非数值向量的输入,同时处理空向量的边界场景
- 预创建和输入向量等长的结果存储向量,避免循环中动态加长向量带来的性能损耗
- 递推计算:第1位的累积和等于元素本身,从第2位开始,每一位的累积和 = 前一位的累积和 + 当前位置的原始值
- 计算完成后直接返回结果向量,全程不调用内置
cumsum()函数
可运行代码
my_cumsum <- function(x) { # 入参校验 if (!is.numeric(x)) { stop("输入参数必须为数值向量") } input_len <- length(x) # 处理空输入边界情况 if (input_len == 0) { return(numeric(0)) } # 初始化等长结果向量 result <- numeric(input_len) # 首位累积和为元素自身 result[1] <- x[1] # 从第二位开始递推计算 for (pos in 2:input_len) { result[pos] <- result[pos - 1] + x[pos] } return(result) }
测试验证
# 测试用例 test_vec <- c(3, 1, 4, 1, 5, 9) my_cumsum(test_vec) # 输出结果:[1] 3 4 8 9 14 23
该递推实现时间复杂度为O(n),效率远高于每次循环从头计算前n项和的写法。
内容的提问来源于stack exchange,提问作者Ferrucio
相关产品推荐
相关产品推荐

