在SICP中,(前2.6)将以下函数描述为"没有数字"的方法.我正在试图理解这一点.作为起点,如何调用这些函数?我可以用输出为1的某种方式实际应用它们吗?(或任何其他数字?)
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x)))))
Run Code Online (Sandbox Code Playgroud)
我最初的尝试没有成功:
Welcome to DrScheme, version 4.1.5 [3m].
Language: Simply Scheme; memory limit: 128 megabytes.
> (add-1 (zero))
. . procedure zero: expects 1 argument, given 0
> (add-1 zero)
#<procedure>
> (add-1 1)
#<procedure>
> ((add-1 1))
. . #<procedure>: expects 1 argument, given 0
>
Run Code Online (Sandbox Code Playgroud) 我在SICP练习1.2时遇到了困难.
将以下内容翻译为前缀形式:
5 + 4 + (2 - (3 - (6 + 4/5))) / 3(6 - 2)(2 - 7)
这就是我所拥有的,我无法弄清楚它为什么不起作用.我错过了什么?
(/
(+
(+ 4 5)
(- 2
(- 3
(+ 6
(/ 4 5)))))
(* 3
(*
(-6 2)
(- 2 7))))
Run Code Online (Sandbox Code Playgroud) 我正在通过Brain harvey进行计算机编程的结构和解释.我遇到了这个问题,我无法弄清楚如何去做.
我们如何在Scheme中使用lambda编写递归过程?
我已经做了近两年的"边做边学"的编程,我认为自己相当不错,但我真的希望建立一个良好的计算机科学/计算机工程基础,大多数人建议我从SICP开始.(计算机程序的结构和解释)
我想知道
尾递归执行与goto相同的效果.或者说,在lang C中,while和goto替换了Scheme中尾递归的作用.是什么让设计师决定在C中保留goto和while实现?我认为人们在实际情况下几乎不会使用'goto'.
如果goto和while要弥补C不能通过递归方式写入来实现迭代的错误,那么它们是否处于相同的特殊构造中? - 避免正常递归.(就像'cond'不同'如果'在Scheme中)这个问题是否与他们保留这两个词的原因有关?
我正在尝试编写一个转换let形式表达式的函数:
Run Code Online (Sandbox Code Playgroud)(let ((var1 exp1) ... (varn expn)) body)
转换lambda为以下形式的(等效)表达式:
((lambda (var1 ... varn) body) exp1 ... expn)
我发现该问题的大多数解决方案似乎都是错误的,有人可以确认是这种情况吗?
;; let expression
(define (let-vars expr) (map car (cadr expr)))
(define (let-inits expr) (map cadr (cadr expr)))
(define (let-body expr) (cddr expr))
(define (let->combination expr)
(cons (make-lambda (let-vars expr) (let-body expr))
(let-inits expr)))
Run Code Online (Sandbox Code Playgroud)
我相信let->combination会返回这种形式的清单:
((lambda (var1 ... varn) body) (exp1 ... expn))
Run Code Online (Sandbox Code Playgroud)
但是,我认为它应该返回的是以下形式的列表:
((lambda (var1 ... varn) body) exp1 ... …
我尝试了所有可能的类型声明,但我不能使这个代码甚至编译.诀窍是处理分裂的类型.我试过Num a,Fractional a,Float a等.
cube x = x * x * x
sum' term a next b =
if a > b
then 0
else term a + sum' term (next a) next b
integral f a b n = (h / 3) * (sum' term 0 succ n) where
h = (b - a) / n
y k = f $ a + (k * h)
term k
| k == 0 || …Run Code Online (Sandbox Code Playgroud) 我应该写一个函数,打印一组给定的三个数字中两个更大数字的平方和.
我笨拙地处理了这种情况.我没有编写一个函数来返回一组3中的两个最大数字,而是编写了函数,以便表达式减少到所需的两个数字.#SSL功能.
我必须这样做的原因是我无法编写可以将多个值一起返回的LISP函数,并且我无法编写可以读取两个值作为参数的LISP函数.
有没有办法可以抽象出其他程序中最大数字的计算?
(define
(min a b)
(if (> a b) b a)
)
(define
(max a b)
(if (< a b) b a)
)
(define
(square a)
( * a a)
)
(define
(ssl a b c)
(+ (square (max a b)) (square (max (min a b) c)))
)
Run Code Online (Sandbox Code Playgroud) 我正忙于计算机程序的结构和解释练习2.18.在这里,我们必须定义一个反向过程以反转列表.它应该做到以下几点:
(reverse (list 1 4 9 16 25))
;; => (25 16 9 4 1)
Run Code Online (Sandbox Code Playgroud)
我想出了以下定义:
(define (reverse list)
(if (null? list)
list
(cons (reverse (cdr list)) (car list))))
;; => (mcons (mcons (mcons (mcons (mcons '() 25) 16) 9) 4) 1).
Run Code Online (Sandbox Code Playgroud)
然后在解决方案中找到类似如下的内容:
(define (reverse items)
(if (null? (cdr items))
items
(append (reverse (cdr items))
(cons (car items) nil))))
;; => (mcons 25 (mcons 16 (mcons 9 (mcons 4 (mcons 1 '()))))).
Run Code Online (Sandbox Code Playgroud)
这里append和cons …
在阅读了计算机程序的结构和解释(SICP)之后,我决定找到一种方法来使用C实现其中一些函数式编程技术.我试着编写一个程序,它创建了一对,其第一个参数是函数的名称,第二个是arg是任何带有一个arg并返回一个arg的函数.使用下面的实现我期望看到如下输出:
fact(7) = 5040
fib(7) = 13
Run Code Online (Sandbox Code Playgroud)
但相反,我得到了
fact(7) = 5040
fib(7) = 0
Run Code Online (Sandbox Code Playgroud)
以及警告
$ cc map.c
map.c: In function ‘main’:
map.c:41:17: warning: assignment from incompatible pointer type [enabled by default]
maps[0].f_ptr = &fact;
^
map.c:43:17: warning: assignment from incompatible pointer type [enabled by default]
maps[1].f_ptr = &fib;
^
map.c:47:7: warning: passing argument 1 of ‘maps[i].f_ptr’ makes pointer from integer without a cast [enabled by default]
ans = (int) maps[i].f_ptr((int) num);
^
map.c:47:7: note: expected ‘void *’ but argument …Run Code Online (Sandbox Code Playgroud)