练习1.31-练习1.34

最近对于Lisp的强大和高深还是深有体会的,可以将函数作为参数进行调用,这样在很大的程度上可以提高函数的抽象性,即将具有公共模式的函数进行抽象。例如在SICP中,首先将累加和的过程进行了抽象,然后在累加和的基础上抽象出了累乘积,进而又发现了累加和与累乘积的共同点,进一步抽象成了一个叫做accumulate的函数,这个函数的是这样的

(accumulate combiner null-value term a next b)

其中combiner为被组合项的组合方式,例如在累加和中可以是“+”,在累乘积中可以是“*”,null-value为默认值,在累加和中为0累乘积中为1,term为函数f,例如在求cube的积分时,f为cube,a为初始值,next为下一次取得值,b为取值的上限。

最后在accumulate函数的基础上加上了对数据的filter使得整个过程更加抽象更加一般。

1.练习1.31

a)

(define (product-recur term a next b)
  (if (> a b)
      1
      (* (term a)
	 (product-recur term (next a) next b))))

(define (factorial-recur n)
  (define (self n)
    n)
  (define (plus-1 n)
    (+ n 1))
  (if (= n 0)
      1
      (product-recur self 1 plus-1 n)))

(define (pi-recur n)
  (define (even? n)
    (= (remainder n 2) 0))
  (define (item n)
    (if (even? n)
	(/ (+ 2 n) (+ 1 n))
	(/ (+ 1 n) (+ 2 n))))
  (define (next-1 n)
    (+ n 1.0))
  (* 4.0
     (product-recur item 1.0 next-1 n)))

b)

(define (product-iter term a next b)
  (define (iter a result)
    (if (> a b)
	result
	(iter (next a) (* (term a) result))))
  (iter a 1))

2.练习1.32

a)

(define  (accumulate combiner null-value term a next b)
  (if (> a b)
      null-value
      (combiner (term a)
		(accumulate combiner null-value term (next a) next b))))

(define (sum-accumulate term a next b)
  (accumulate + 0 term a next b))

(define (product-accumulate term a next b)
  (accumulate-iter * 1 term a next b))

b)

(define  (accumulate-iter combiner null-value term a next b)
  (define (iter a result)
    (if (> a b)
	result
	(iter (next a) (combiner result (term a)))))
  (iter a null-value))

3.练习1.33

(define (filtered-accumulate filter combiner null-value term a next b)
  (define (iter a result)
    (cond ((> a b) result)
	  ((filter a) (iter (next a) (combiner (term a) result)))
	  (else (iter (next a) result))))
  (iter a null-value))

a)

(define (prime-sum a b)
  (define (next-1 a)
    (+ a 1))
  (define (self a)
    a)
  (filtered-accumulate prime? + 0 self a next-1 b))

b)

(define (GCD-1-product n)
  (define (GCD-1-n? a)
    (= (GCD a n) 1))
  (define (next-1 a)
    (+ a 1))
  (define (self a)
    a)
  (filtered-accumulate GCD-1-n? * 1 self 1 next-1 (- n 1)))

4.练习1.34

可以这么解释(f f)->(f 2)->(2 2),最后由于2这个函数没有定义,所以报错结束。


网上发现了这个点击打开链接,很不错,貌似是一些人做的项目,目的是解答SICP上的所有题,貌似很久没有更新了,但以后做了题还是可以和这个上面已有的解答对对了。


已标记关键词 清除标记
相关推荐
内容简介 《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 -------------------------------------------------------------------------------- C是一门简洁精妙的语言,掌握基本语法容易,真正能够自如运用,就不那么简单了。你难免会遇到各种各样的问题,有些可能让你百思不得其解,甚至翻遍图书馆,也找不到问题的答案。 《你必须知道的495个C语言问题》的出版填补了这一空白。许多知识点的阐述都是其他资料中所没有的,弥足珍贵。 涵盖C99标准 目录 ~第1章 声明和初始化 1 基本类型 1 1.1 我该如何决定使用哪种整数类型? 1  1.2 为什么不精确定义标准类型的大小? 2 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 2  1.4 新的64位机上的64位类型是什么样的? 3 指针声明 3 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 3 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char *p; *p=malloc(10); 4 声明风格 4 1.7 怎样声明和定义全局变量和函数最好? 4 1.8 如何在C中实现不透明(抽象)数据类型? 5 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 6 1.11 extern在函数声明中是什么意思? 6 1.12 关键字auto到底有什么用途? 7 类型定义(typedef) 7 1.13 对于用户定义类型,typedef 和#define有什么区别? 7 1.14 我似乎不能成功定义一个链表。我试过typedef struct{char *item; NODEPTR next;}* NODEPTR; 但是编译器报了错误信息。难道在C语言中结构不能包含指向自己的指针吗? 7  1.15 如何定义一对相互引用的结构? 9 1.16 Struct{ } x1;和typedef struct{ } x2; 这两个声明有什么区别? 10 1.17 “typedef int(*funcptr)();”是什么意思? 10 const 限定词 10 1.18 我有这样一组声明:typedef char *charp; const charp p; 为什么是p而不是它指向的字符为const? 10 1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?const int n=5; int a[n]; 10 1.20 const char *p、char const *p和char *const p有什么区别? 10 复杂的声明  11 1.21 怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 11  1.22 如何声明返回指向同类型函数的指针的函数?我在设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针。可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数……,如此往复,以至无穷。 12  数组大小 13 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定大小的参数数组? 13 1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 13 声明问题 14 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 14 *1.26 main的正确定义是什么?void main正确吗? 15 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 15 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 15 1.29 为什么我的编译器不允许我定义大数组,如double array[256][256]?
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页