【问题标题】:Pascal's Triangle Row Sequence帕斯卡三角行序列
【发布时间】:2012-09-06 23:24:25
【问题描述】:

我目前正在寻找帕斯卡三角形的行序列。我想输入行号并输出列表中的数字序列,直到该行。例如,(Pascal 4) 将给出结果(1 1 1 1 2 1 1 3 3 1)

我正在尝试使用我找到的算法。这是算法本身:

Vc = Vc-1 * ((r - c)/c)

rc 应该是行和列,并且 V0=1。该算法可以在维基百科页面上标题为“计算和单个行或对角线”的部分中找到。

这是我目前的代码:

(define pascal n)
  (cond((zero? n) '())
       ((positive? n) (* pascal (- n 1) (/ (- n c)c))))

我知道这几乎没有什么,但我一直在努力寻找使用 letlambda 来合并列值的函数范围。此外,我也一直在为递归而苦苦挣扎。我真的不知道如何建立基本案例以及如何进入下一步。基本上,我到处都迷路了。我知道这并没有显示太多,但我们将不胜感激朝着正确方向迈出的任何一步。

【问题讨论】:

    标签: recursion scheme pascals-triangle


    【解决方案1】:

    使用 Wikipedia 中的 entry 作为指南,这是计算帕斯卡三角形中给定行和列的值的算法的简单实现,如链接中所述:

    #lang racket
    
    (define (pascal row column)
      (define (aux r c)
        (if (zero? c)
            1
            (* (/ (- r c) c)
               (aux r (sub1 c)))))
      (aux (add1 row) column))
    

    例如,以下将返回前四行值,注意行和列都以零开头:

    (pascal 0 0)
    
    (pascal 1 0)
    (pascal 1 1)
    
    (pascal 2 0)
    (pascal 2 1)
    (pascal 2 2)
    
    (pascal 3 0)
    (pascal 3 1)
    (pascal 3 2)
    (pascal 3 3)
    

    现在我们需要一个过程来将所有值粘在一起直到所需的行;这适用于球拍:

    (define (pascal-up-to-row n)
      (for*/list ((i (in-range n))
                  (j (in-range (add1 i))))
        (pascal i j)))
    

    结果如预期:

    (pascal-up-to-row 4)
    > '(1 1 1 1 2 1 1 3 3 1)
    

    【讨论】:

      【解决方案2】:

      我在blog 讨论了帕斯卡三角。

      在您的问题中,Vc 的表达式仅针对一行。转换成这样的代码:

      (define (row r)
        (let loop ((c 1) (row (list 1)))
          (if (= r c)
              row
              (loop (+ c 1) (cons (* (car row) (- r c) (/ c)) row)))))
      

      然后你只需将一堆行放在一起组成三角形:

      (define (rows r)
        (let loop ((r r) (rows (list)))
          (if (zero? r)
              rows
              (loop (- r 1) (append (row r) rows)))))
      

      这是输出:

      > (rows 4)
      (1 1 1 1 2 1 1 3 3 1)
      

      基本情况是第一个函数中的(= r c) 和第二个函数中的(zero? r)

      如果你想清楚地写下标,你可以采用 TeX 使用的表示法:下标由下划线引入,上标由插入符号引入,任何大于一个字符的都用大括号括起来。因此,您的符号中的 Vc 将是 V_c,而您的符号中的 Vc-1 将是 V_{c-1}。

      【讨论】:

      • 感谢您的快速响应!所以第一个函数有 c 作为计数器。 let 循环将 c 设置为 1,并且 c 将每次加 1,直到 r 和 c 相等,其中将返回哪一行。我也可以看到算法是如何实现的。我不确定的一个部分是行(列表 1)。所以这使得'(1)。在行通过(汽车行)之后,这是否意味着我们现在有一个空集?该元素 1 现在与 (-r 1) (/c) 相乘。我的理解是 cons 应该结合元素和列表。我看到了元素。但是列表应该排在后面吗?
      • 在函数的最后一行,cons 将使用 WikiPedia 中的公式计算的新元素放在现有行的开头。例如,当调用 (row 4) 时,变量 row 最初是 (1),然后第一次通过循环它变为 (3 1),c 变为 2,然后第二次通过循环变为 (3 3 1 ) 并且 c 变为 3,然后第三次循环 row 变为 (1 3 3 1) 并且 c 变为 4,然后第四次循环 r 和 c 都是 4 所以函数返回 row 的当前值,即是 (1 3 3 1)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2012-07-13
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多