R循环中向向量追加结果不覆盖的方法?帕斯卡三角实现求助
解决你的R语言帕斯卡三角问题
嘿,刚上手R的话遇到这种小bug很正常,我帮你捋清楚问题出在哪,再给你修正方案~
问题根源
你代码里的核心问题是没有正确累积计算结果:
- 你初始化了
M <- c(),但在循环里从来没更新过它!每次执行list_results <- append(result,M)时,M始终是空向量,所以list_results每次都只有当前的result值。 - 循环结束后,
list_results就只剩最后一次循环的结果choose(10,10)=1,当你把这个单元素向量转成11×11矩阵时,R会自动重复填充这个值,所以得到全1的矩阵。
修正后的代码
只需要把结果正确追加到M中,最后再转成矩阵(注意加上byrow=TRUE让结果按行排列,符合帕斯卡三角的行逻辑):
M <- c() for (n in 0:10) { for (k in 0:10) { result <- choose(n, k) M <- append(M, result) # 关键:把新结果追加到M,更新M } } Pascal <- matrix(M, ncol=11, byrow=TRUE)
运行后你会看到正确的11×11帕斯卡三角矩阵,比如第一行是1 0 0 ... 0,第二行是1 1 0 ... 0,以此类推。
关于append/rbind/paste的区别
给你明确区分这三个工具的用途,以后就不会搞混啦:
append():这是你这次需要的工具,专门用来给一维向量添加元素,适合像这样先累积所有结果到向量,再转成矩阵的场景。rbind():用来给矩阵或数据框添加行,如果你一开始就用矩阵存储,每次循环生成一行数据再追加,就可以用它,但这次用向量累积更简单。paste():完全是用来拼接字符串的,和数值计算、向量累积没关系,千万别在这种场景用~
更简洁的写法(可选)
其实R里可以不用嵌套循环,用outer()函数一行搞定,效率更高:
Pascal <- outer(0:10, 0:10, function(n, k) choose(n, k))
这个函数会自动遍历所有n和k的组合,计算对应的组合数,直接生成目标矩阵。
内容的提问来源于stack exchange,提问作者XY user
相关产品推荐
相关产品推荐

