你会如何在 R 中编写 Pascal 的三角形?

问题描述 投票:0回答:3

我正在阅读,关于我自己(不是为了 HW)关于编程,并且一个练习涉及在 R 中对 Pascal 的三角形进行编程。我的第一个想法是制作一个列表然后将内容附加到它,但这并不太奏效。然后我想到从一个矢量开始,最后用它制作一个列表。然后我想到做一个矩阵,最后用它做一个列表。

不确定用哪种方法来解决这个问题。

有什么提示吗?

谢谢

r math combinatorics
3个回答
10
投票

Rosetta Code上有一个解决方案:

pascalTriangle <- function(h) {
  for(i in 0:(h-1)) {
    s <- ""
    for(k in 0:(h-i)) s <- paste(s, "  ", sep="")
    for(j in 0:i) {
      s <- paste(s, sprintf("%3d ", choose(i, j)), sep="")
    }
    print(s)
  }
}

如果我自己开发它,我会把它存储在一个列表中,因为这是处理可变长度行的最自然的数据结构。但是在做出该决定之前,您确实需要澄清用例。您是否打算在生成数据后对其进行分析?

编辑:

这里是用更少的循环重写的 Rosetta 解决方案,并将结果存储为列表:

pascalTriangle <- function(h) {
  lapply(0:h, function(i) choose(i, 0:i))
}

4
投票

使用帕斯卡三角形的属性:

x <- 1
print(x)
for (i in 1:10) { x <- c(0, x) + c(x, 0); print(x) }

我想这段代码非常快。


0
投票

这是一个避免循环的解决方案(R 不是循环的忠实粉丝):

sapply(1:10, function(n) sapply(0:n, function(k) choose(n, k)))

您可以用任何向量替换

1:10
,甚至是不连续的向量:

R> sapply(c(5, 10), function(n) sapply(0:n, function(k) choose(n, k)))
[[1]]
[1]  1  5 10 10  5  1

[[2]]
[1]   1  10  45 120 210 252 210 120  45  10   1
© www.soinside.com 2019 - 2024. All rights reserved.