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)

 执行结果的输出截图如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值