第十一章 处理任意大的自然数
最后更新于:2022-04-02 04:14:23
[TOC]
## 由n个 hello构成的表
下面设计函数 hellos,该函数以自然数n为参数,输出为由n个 hello构成的表,该函数的合约为:
```
;由n个 hello构成的表
;hellos:n->list-of-symbols
;预期值
;(hellos 0)
;empty
;(hellos 1)
;(cons 'hello empty) ->(cons 'hello (hellos 0)) ;可以看出带有递归性
; (hellos 2)
; (cons 'hello (cons 'hello empty)) -> (cons 'hello (hellos 1))
(define (hellos n)
(cond
[(= n 0) empty]
[else (cons 'hello (hellos (- n 1)))]))
(hellos 2) ;(list 'hello 'hello)
```
## 11.2.1
把 hellos一般化为 repeat,该函数读入自然数n和一个符号,返回包含n个符号的表。
```
(define (repeat sym n)
(cond
[(= n 0) empty]
[else (cons sym (repeat sym (- n 1)))]))
(repeat 'hello 3) ; (list 'hello 'hello 'hello)
```
## 11.2.2
设计函数 tabulate-f,把函数f应用于一些由自然数值组成的表,其中f是
```
;; f:number->number
(define (f x)
(+ (* 3 (* x x))
(+ (* -6 x))
-1))
```
具体地说,函数读入自然数n,返回由n个posn结构体组成的表,表的第一个元素是点`n (f n)`,第二个元素是点`(n-1 (f n-1))`,以此类推。
解答
```
;(f 0) ;-1
;(f 1) ;-4
(define (f x)
(+ (* 3 (* x x))
(+ (* -6 x))
-1))
;tabulate-f: n-> (cons (n fn) (cons (n-1 (f n-1))))
;0 -> empty
;1 -> (cons (1 (f 1) empty)) -> (cons (1 (f 1) (tabulate-f 0)))
;2 -> (cons (2 (f 2) (cons (1 (f 1)) empty))) ->(cons (2 (f 2) (tabulate-f 1) ))
(define (tabulate-f n)
(cond
[(= n 0) empty]
[(= n 1) (cons (make-posn 1 (f 1)) empty)]
[else (cons (make-posn n (f n)) (tabulate-f (- n 1)))]))
;(tabulate-f 0) ;'()
;(tabulate-f 1) ;(list (make-posn 1 -4))
(tabulate-f 2) ;(list (make-posn 2 -1) (make-posn 1 -4))
```
## 11.4.3
设计 product-from-minus-11这个函数读入一个大于或等于-11的整数n,返回在-11(不包括)和n(包括)之间所有数的乘积。
解答
```
;product-from-minus-11:number->number
; -11 -> 1
; -10 -> -10*1
; -9 -> -9*-10
; -8 -> -8*-10*-9 - > -8 * (product-from-minus-11 -9 )
; -n -> n * (product-from-minus-11 (- n 1) )
(define (product-from-minus-11 n)
(cond
[(= n -11) 1]
[else (* n (product-from-minus-11 (- n 1)))]))
;(product-from-minus-11 -11) ;-1
(product-from-minus-11 -10) ;-10
```
## 11.5.2
定义函数 multiply,其输入是两个自然数n和x,不使用 Scheme提供的*,返回n*x。最后,去除这些定义之中的+。
提示:n乘以x就是把n个x加起来。
解体
```
;; multiply:number,number->number
;; 0,2->0
;; 1,2->1*2
;; 2,2->2*2
;; 3,3->2*2*2->2*(multiply 2 2)
;; n,x->x*(multiply (- n 1) x)
(define (multiply n x)
(cond
[(= n 0)0]
[(= n 1)x]
[else (* x (multiply (- n 1) x))]))
(multiply 0 2);0
(multiply 1 2);2
(multiply 3 2);8
```
';