R语言生成小于400万斐波那契数列:代码优化咨询
嘿,作为R语言新手能完成这个斐波那契数列的任务已经超棒啦!咱们一步步来优化你的代码,让它更简洁、易读还高效~
首先先聊聊你现有代码里可以改进的小细节:变量命名太模糊(x、y、z谁能一眼看懂作用?)、重复的cat输出有点冗余、循环条件可以更直接,而且咱们还能利用斐波那契数列的数学规律来大幅减少计算量。
版本1:基础可读性优化
先给你一个对原代码的直接优化版,重点提升可读性和简洁度:
# 用有意义的变量名,一眼看懂每个变量的作用 prev_prev <- 0 # 斐波那契数列的前前项 prev <- 1 # 斐波那契数列的前项 even_sum <- 0 # 偶数项的累加和 threshold <- 4000000 # 输出初始的前两项,用sep参数统一控制分隔符 cat(prev_prev, prev, sep = " ") # 循环生成后续数列 while (TRUE) { current <- prev_prev + prev # 超过阈值就停止循环,逻辑更直接 if (current > threshold) break cat(" ", current, sep = "") # 判断偶数并累加 if (current %% 2 == 0) { even_sum <- even_sum + current } # 更新前两项的值,为下一次循环做准备 prev_prev <- prev prev <- current } # 别忘了初始的0是偶数,要加到总和里 even_sum <- even_sum + 0 cat("\n偶数项的和为:", even_sum, "\n")
这个版本的改进点:
- 变量命名清晰,别人(包括一周后的你)看代码能瞬间明白逻辑
- 把重复的
cat(" ")整合到参数里,减少冗余代码 - 循环条件改成判断生成的新数是否超过阈值,逻辑更直观
版本2:利用数学规律高效优化
斐波那契数列里有个隐藏规律:每3项会出现一个偶数(奇+奇=偶,偶+奇=奇,奇+偶=奇,循环往复),而且偶数项本身也满足递推公式:E(n) = 4*E(n-1) + E(n-2)。利用这个规律,咱们可以直接生成所有偶数项,跳过奇数项,效率提升一大截:
threshold <- 4000000 even_sum <- 0 # 初始的偶数项:0, 2, 8, 34... e_prev_prev <- 0 e_prev <- 2 # 先加上初始的0 even_sum <- even_sum + e_prev_prev # 判断第二个偶数项是否在阈值内 if (e_prev <= threshold) { even_sum <- even_sum + e_prev } # 用偶数项的递推公式生成后续项 while (TRUE) { e_current <- 4 * e_prev + e_prev_prev if (e_current > threshold) break even_sum <- even_sum + e_current # 更新偶数项的前两项 e_prev_prev <- e_prev e_prev <- e_current } cat("偶数项的和为:", even_sum, "\n")
这个版本适合处理超大阈值的场景,不用遍历整个数列,直接锁定目标计算,效率拉满。
版本3:更具R风格的向量化写法
R天生擅长向量化操作,咱们可以用向量来存储整个斐波那契数列,代码会更简洁:
threshold <- 4000000 # 初始化数列 fib <- c(0, 1) # 循环生成后续项,直到下一个数超过阈值 while (tail(fib, 1) + tail(fib, 2) <= threshold) { fib <- c(fib, tail(fib, 1) + tail(fib, 2)) } # 直接筛选偶数项求和,一步到位 even_sum <- sum(fib[fib %% 2 == 0]) cat("斐波那契数列:", fib, "\n") cat("偶数项的和为:", even_sum, "\n")
这个版本充分利用了R的向量特性,代码简洁易懂,新手也能快速上手。
最后总结几个优化小技巧:
- 变量命名要清晰,别用x、y、z这种无意义的名字,可读性永远是第一位的
- 尽量减少重复操作(比如多次
cat),利用函数或参数简化代码 - 能利用数学规律就别硬遍历,效率提升非常明显
- 结合R的向量化特性,让代码更符合R的风格
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

