我看到的所有与Pascal Triangle相关的代码都是打印直角三角形。我如何打印像这样的三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
我见过类似代码的示例
def pascal(c: Int, r: Int): Int = c match {
case 0 => 1
case `c` if c >= r => 1
case _ => pascal(c-1, r-1)+pascal(c,r-1)
}
for (row <- 0 to 5) {
for (col <- 0 until row)
print(pascal(col, row)+ " ")
println()
}
答案 0 :(得分:1)
诀窍是当数字增加到3、4和5位数字时尝试平衡三角形。
def pascalTriangle(height :Int) :Unit =
Stream.iterate(Vector(1))(v => (0+:v:+0).sliding(2).map(_.sum).toVector)
.take(height)
.map(_.mkString(" "))
.scanRight(("",0)){ case (line,(prev,padLen)) =>
(line, if (prev=="") 0 else (prev.length - line.length)/2 + padLen)
}.map{case (str,pad) => "." + " "*pad + str}
.foreach(println)
用法:
pascalTriangle(17)
. 1
. 1 1
. 1 2 1
. 1 3 3 1
. 1 4 6 4 1
. 1 5 10 10 5 1
. 1 6 15 20 15 6 1
. 1 7 21 35 35 21 7 1
. 1 8 28 56 70 56 28 8 1
. 1 9 36 84 126 126 84 36 9 1
. 1 10 45 120 210 252 210 120 45 10 1
. 1 11 55 165 330 462 462 330 165 55 11 1
. 1 12 66 220 495 792 924 792 495 220 66 12 1
. 1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1
. 1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1
. 1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1
.1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1
.
前导点.
用于折叠前导空格的显示器。
答案 1 :(得分:0)
您需要创建一组线并使用最长的线来计算其他线的偏移量。
def pascal(c: Int, r: Int): Int = c match {
case 0 => 1
case `c` if c >= r => 1
case _ => pascal(c-1, r-1)+pascal(c,r-1)
}
val lines =
(0 to 5)
.map(row => (0 to row).map(col => pascal(col, row)))
.map(_.mkString(" "))
val maxLength = lines.map(_.length).max
lines.foreach { line =>
val len = line.length
val numpad = (maxLength - len) / 2 + 1
val padding = (1 to numpad).foldLeft("")((acc, _) => acc ++ " ")
println("|" ++ padding ++ line ++ padding ++ "|")
}
打印:
| 1 |
| 1 1 |
| 1 2 1 |
| 1 3 3 1 |
| 1 4 6 4 1 |
| 1 5 10 10 5 1 |
由于某种原因(至少在我的工作表上),除非空格之前没有空格,否则它不会打印空格。奇怪吗?!?