SICP习题2.6 题目理解

这道习题的题目我读了好几次都没懂,后来懂了,把自己的理解记录下

这个理解仅仅包括理解题意,对各种复杂的知识,比如lambda演算、图灵机柯里化等复杂知识均不涉及

1、题目理解

题目说不需要用数字(例如我们常用的阿拉伯数字)来表示数字,而用函数来表示,初看很懵逼

其实自然数只是一个抽象概念,你可以用1、2、3表示,你也可以用狗、狗狗、狗狗狗表示,你也可以用喵、喵喵、喵喵喵表示,甚至可以用旺财、富贵、吉祥来表示(虽然这种表示没啥逻辑)

所以也可以用函数来表示数

用函数表示数,称为丘奇数,总之这个叫邱奇的人很牛逼,丘奇数等一系列lambda演算的东东都很牛逼,是Scheme语言的基础,因为数用函数表示,一切都是函数,解释器什么的写起来也肥肠方便,用函数表示数非常有意义

现在题目给出了丘奇数零和加一的定义,按着这个逻辑,求一求丘奇数一、丘奇数二等的表达,就可以了,其他的以后再说

2、解题过程

求1,1就是(add-1 zero),2就是(add-1 one),以此类推,答案在下面,展开就是了

;; Exercise 2.6
;; 丘奇数
#lang racket

;; 0
(define zero (lambda (f) (lambda (x) x)))

;; 加1
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))

;; 1
(define one
  (lambda (f) (lambda (x) (f x))))

;; 2
(define two
  (lambda (f) (lambda (x) (f (f x)))))

总结一下,丘奇数,就是f(f(f(...x)))中,调用f的次数来表示对应的数的

仔细看一下丘奇数的函数,(丘奇数 f)这个调用所返回的函数就是给输入套上多层f的外壳,丘奇数对应几就套几个f壳

所以加法就是一个套壳的操作,两个输入是m和n(注意是丘奇数不是阿拉伯数字),先套n个壳,再套m个壳,就是加法了

;; 加
(define (add m n)
  (lambda (f)
    (lambda (x)
      ((m f) ((n f) x)))))

 

你可能感兴趣的:(SICP)