`

SICP 第一章 1.1.1-1.1.6 学习

    博客分类:
  • FP
阅读更多
      最近有幸看到了SICP这本书,现在开始慢慢啃这本书,在这里留下一些学习记录,也算一个计划吧。只有做些习题才能体验什么是FP,所以我会把自己学习中做的SICP的提记录在这里。
      这里会列出第一章中习题的答案。

      练习 1.1
10
12
8
3
6
将3和a关联 类似于 a=3
将用上一步定义的a的值来替换a计算后的结果4和b关联 类似于 b=4
引用环境中定义的a和b 19
#f(false)
判断结果是真则返回b即4
b=4为真则返回16
b>a返回6
4*4返回16
     
      练习 1.2
( / ( +  5
                4
             (-  2
                 ( -  3
                      (+  6
                           (/  4  5)
                      )
                  )
              )
      )
      ( *  3
            ( -  6  2 )
            ( -  2  7 )
      )

      练习 1.3
(define  (sumMax x y z )
          ( cond  ((and (> x y)(> y z))(+ x y))
                         ((and (> x y) (> z y))(+ x z))
                         ((and (> y x) (> x z))(+ x y))
                         ((and (> y x) (> z x))(+ y z))
          )
)
逻辑清楚但是多了一些逻辑判断,改成if形式
(define  (sumMax x y z )
          (if (> x y)
               (if (> y z)
                    (+ x y)
                    (+ x z)      
                )
               (if (> z x)
                    (+ y z)
                    (+ x y)
                )       
          )

典型的if else的写法。
求最大和第二大元素的和
(define  (sumMax x y z )
          (+ (if ( > z ( if (> x y)
                                    x
                                    y
                           )
                    )
                     z
                     (if (> x y)
                         x
                         y
                     ) )    
               (if ( < z ( if (< x y)
                                     x
                                     y
                           )
                     )
                    (if (< x y)
                         x
                         y
                     )  
                   (if (< z (if (> x y)
                             x
                             y
                            ))
                          z
                          (if (> x y) x y)
                          )
                      
          )
))

  练习 1.4
做这道题让我想到了离散数学中的群论,看来数学无处不在。
答:根据b的值来确定做什么运算,运算符可以作为结果来返回

  练习 1.5
当采用正则序时,是先不求出运算对象的值,直到实际需要他们的值时才去做,首先是形参和实参的替换
(if(= 0 0)
     0
    (p)//这里是过程名,表达式还没有求值,只是做的简单的替换

因为if判断和求序无关,所以这个过程不会被计算
返回值为0

当采用应用序求值时,是先计算出运算的值
(if(= 0 0)
       0
     (p) //这里就是值,表达式已经被求值过了,但是会无限递归


因为无限递归所以程序内存耗尽,报错
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics