无法在Scala中打印正确的帕斯卡三角形

时间:2019-02-20 23:48:52

标签: scala

我看到的所有与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()
}

2 个答案:

答案 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 |

由于某种原因(至少在我的工作表上),除非空格之前没有空格,否则它不会打印空格。奇怪吗?!?