R语言如何存储递归函数的中间调用结果并最终返回?
问题原因
- 函数内使用
v_id <- c(v_id, id)属于局部赋值,仅作用于当前函数调用的栈帧,不会修改你在全局定义的v_id变量 - 递归调用
myfunc(new_id)的返回值没有被接收拼接,最终触发else分支时返回的是最内层调用的空v_id,因此得到NULL结果
方案1:使用environment实现(匹配你的猜想思路)
该方案通过引用传递的环境变量存储中间结果,不会污染全局作用域:
myfunc <- function(id) { # 初始化当前函数专属的环境,生命周期和外层函数绑定 temp_env <- new.env() temp_env$res_vec <- c() # 内部递归逻辑 inner_recur <- function(current_id) { temp_env$res_vec <- c(temp_env$res_vec, current_id) new_id <- current_id - 1 if (new_id >= 0) { inner_recur(new_id) } } inner_recur(id) return(temp_env$res_vec) }
调用myfunc(2)即可得到输出2 1 0。
方案2:无额外依赖的纯递归实现(更优,无副作用)
无需引入环境或全局变量,直接通过递归返回值拼接得到结果,逻辑更简洁:
myfunc <- function(id) { # 递归终止条件:id为0时直接返回0 if (id == 0) { return(0) } # 拼接当前id和后续递归的返回结果 return(c(id, myfunc(id - 1))) }
该方案没有全局变量污染,也不需要额外维护存储环境,是实现该需求的更优选择。
内容的提问来源于stack exchange,提问作者Joe King
相关产品推荐
相关产品推荐

