无法在scala中打印正确的pascal三角形
我看到的所有与Pascal三角形相关的代码都是打印直角三角形。如何打印一个三角形无法在scala中打印正确的pascal三角形,scala,Scala,我看到的所有与Pascal三角形相关的代码都是打印直角三角形。如何打印一个三角形 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
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()
}
def pascal(c:Int,r:Int):Int=c匹配{
案例0=>1
如果c>=r=>1,则为'c'情况
case=>pascal(c-1,r-1)+pascal(c,r-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)
}
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 |
出于某种原因(至少在我的工作表上),除非前面有什么东西,否则它不会打印空格。奇怪?!?诀窍是在数字增长到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
.
前导点
用于折叠前导空格的显示。您可以从转换C代码示例开始。它应该非常简单。您可以插入打印(“*(5行))
在
的第二个之前。这实际上不会在三角形达到某个数字后打印三角形。我找到了一个由rwilson编写的解决方案-