我自己在阅读(不是为了HW)有关编程的书籍,其中一个练习涉及到用R语言编写Pascal三角形。我的第一个想法是做一个列表,然后在上面添加内容,但效果不太好。然后我想到从一个向量开始,最后列出一个列表。然后我想到做一个矩阵,最后列出一个列表。不知道该怎么办。有什么提示吗?谢谢
yizd12fk1#
在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)) }
00jrzges2#
使用Pascal三角形的性质:
x <- 1 print(x) for (i in 1:10) { x <- c(0, x) + c(x, 0); print(x) }
我想这个代码是非常快的。
ryoqjall3#
这里有一个避免循环的解决方案(R不是循环的忠实粉丝):
sapply(1:10, function(n) sapply(0:n, function(k) choose(n, k)))
你可以用任何向量替换1:10,甚至是不连续的向量:
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
3条答案
按热度按时间yizd12fk1#
在Rosetta Code上有一个解决方案:
如果我自己开发它,我会将其存储在列表中,因为这是处理可变长度行的最自然的数据结构。但在做出决定之前,您确实需要澄清一个用例。您是否打算在数据生成后对其进行分析?
以下是重写的Rosetta解决方案,减少了循环,并将结果存储为列表:
00jrzges2#
使用Pascal三角形的性质:
我想这个代码是非常快的。
ryoqjall3#
这里有一个避免循环的解决方案(R不是循环的忠实粉丝):
你可以用任何向量替换
1:10
,甚至是不连续的向量: