无法在scala中打印正确的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

我看到的所有与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 (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编写的解决方案-