如何修改R语言中卡特兰数递归函数以支持数值范围输入?
解决R语言卡特兰数函数无法处理向量输入的问题
你的递归卡特兰数函数在处理单个数值时逻辑是正确的,但遇到向量输入(比如1:10)时出错,核心原因是R的基础if语句不支持长度大于1的条件判断:当你输入1:15时,numb == 0会生成一个长度为15的布尔向量,if只会取第一个元素(也就是FALSE)来执行逻辑,导致递归计算完全偏离了卡特兰数的公式,最终输出错误结果。
下面给你几种可行的修复方案:
方案1:用Vectorize()快速包装原函数
这是最简单的修复方式,不需要修改你原有的递归逻辑,Vectorize()会自动把你的单参数函数转换成支持向量输入的版本:
# 保留你原有的递归函数 catalan_num_recr <- function(numb){ if (numb == 0){ return(1) } else { return(((4*numb - 2)*catalan_num_recr(numb-1))/(numb+1)) } } # 生成支持向量输入的函数 catalan_num_vec <- Vectorize(catalan_num_recr) # 测试向量输入 catalan_num_vec(0:10) # 输出正确结果:[1] 1 1 2 5 14 42 132 429 1430 4862 16796
方案2:手动遍历向量元素
你也可以直接在函数内部用sapply遍历输入向量的每个元素,逐个调用递归逻辑:
catalan_num_vec <- function(numb_vec){ sapply(numb_vec, function(n){ if (n == 0){ return(1) } else { # 用Recall()调用当前函数本身,实现递归 return(((4*n - 2)*Recall(n-1))/(n+1)) } }) } # 测试 catalan_num_vec(1:5) # 输出:[1] 1 2 5 14 42
方案3:改用迭代计算(更高效,适合大n)
递归方式在n较大时可能会出现栈溢出的问题,迭代计算不仅支持向量输入,运行效率也更高:
catalan_num_iter <- function(numb_vec){ sapply(numb_vec, function(n){ if (n == 0) return(1) catalan <- 1 for (i in 1:n){ catalan <- catalan * (4*i - 2)/(i + 1) } return(catalan) }) } # 测试 catalan_num_iter(0:15) # 输出正确的卡特兰数序列
所有方案测试后,都能正确处理向量输入,返回对应的卡特兰数结果。
内容的提问来源于stack exchange,提问作者Pragyaditya Das
相关产品推荐
相关产品推荐

