R语言for循环实现n次迭代运算的代码错误排查
问题根因
你的代码存在两个逻辑错误,导致无法生成正确序列:
- 未正确引用上一轮迭代的计算值:循环内每次都用整个
z向量乘1/2,而非取上一轮的结果z[i-1]参与计算 - 未初始化合适长度的结果存储对象:初始仅给
z赋值单个数值1,循环过程中动态修改向量长度+整向量运算,会触发R的隐式类型转换/值截断,最终结果长度和数值都不符合预期
修正方案
写法1:修正for循环逻辑
提前初始化存储向量,每轮取上一轮值计算:
# 初始化长度为11的向量,第一个位置存初始值1,后续10个位置存10轮迭代结果 z <- numeric(11) z[1] <- 1 for(i in 2:11) { z[i] <- z[i-1] * 1/2 } # 输出完整序列(含初始值1) z # 如果只需要10轮迭代的减半结果,不需要初始值,执行 z <- z[-1] 即可
运行后输出的完整序列为:[1] 1.0000000000 0.5000000000 0.2500000000 0.1250000000 0.0625000000 0.0312500000 0.0156250000 0.0078125000 0.0039062500 0.0019531250 0.0009765625
写法2:更简洁的向量化实现
R里优先用向量化运算代替显式循环,一行代码就能实现:
# 含初始值1的10轮减半序列 z <- 1 / 2^(0:10) # 仅保留10轮迭代结果、不含初始值的话,用 z <- 1 / 2^(1:10)
内容的提问来源于stack exchange,提问作者Nonce
相关产品推荐
相关产品推荐

