sicp練習1.12 帕斯卡三角(楊輝三角)

楊輝三角以前在學習c語言時候,用循環很容易實現。由於剛剛接觸函數式語言,遞歸和迭代方式實現循環還沒深入我心。下意思的想用鏈表來實現,但發現自己對scheme的鏈表操作太不熟悉,總會出現這樣那樣子的無法自我解釋的問題。最後參考了@dennis_zane的pascal實現,dennis_zane是把楊輝三角左對齊,然後根據座標之間的關係實現:(pascal x y) ,其中x,y爲座標,(pascal x y) 的值爲座標對應的楊輝三角數值。看了dennis_zane的實現以後,很慚愧自己沒有想到。想想其未最終打印出結果,那我來繼續完成其工作。當然也是用遞歸和迭代。

 

(define (pascal x y)
        (cond ((> y x) (display "error"))
              ((= x 1) 1)
              ((= x 2) 1)
              ((= y 1) 1)
              ((= x y) 1)
              (else 
              (+ (pascal (- x 1) y) (pascal (- x 1) (- y 1))))))
;(pascal 3 2)
(define (display-blank-space n)
  (if(> n 0)(begin (display " ")
                   (display-blank-space (- n 1)))))

(define (pascal-display x y n)
  (cond ((and (<= x n) (= x y) (not (= y 1))) (begin (display(pascal x y)) 
                                                     (display "\n")
                                                     (pascal-display (+ x 1) 1 n)))
        ((and (<= x n) (= x y) (= y 1)) (begin (display-blank-space (- n x)) 
                                               (display(pascal x y)) 
                                               (display "\n")
                                               (pascal-display (+ x 1) 1 n)))
        ((and (<= x n) (> x y) (not (= y 1)))  (begin (display(pascal x y)) 
                                                      (display " ") 
                                                      (pascal-display x  (+ y 1) n)))
        ((and (<= x n) (> x y) (= y 1)) (begin (display-blank-space (- n x)) 
                                               (display(pascal x y)) 
                                               (display " ") 
                                               (pascal-display x  (+ y 1) n)))
        (else (begin (display "end! ")
                     (display n)
                     (display " rows were displayed")))))

(pascal-display 1 1 8)

 執行結果的輸出截圖如下:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章