标签: sicp

我如何从SICP调用Scheme号函数

在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)

scheme sicp

1
推荐指数
1
解决办法
638
查看次数

SICP练习1.2

我在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)

scheme sicp

1
推荐指数
1
解决办法
923
查看次数

方案:我们如何用lambda编写递归过程?

我正在通过Brain harvey进行计算机编程的结构和解释.我遇到了这个问题,我无法弄清楚如何去做.

我们如何在Scheme中使用lambda编写递归过程?

recursion lambda scheme sicp

1
推荐指数
2
解决办法
3742
查看次数

SICP的先决条件

我已经做了近两年的"边做边学"的编程,我认为自己相当不错,但我真的希望建立一个良好的计算机科学/计算机工程基础,大多数人建议我从SICP开始.(计算机程序的结构和解释)

我想知道

  • 这是最好的方式吗?
  • 我知道如何在OpenMP和MPI中编码矩阵乘法,我知道大学水平的数学,这是否足以阅读和欣赏SICP?
  • 而不是这样,我可以把所有时间花在Project Euler上吗?

sicp

1
推荐指数
1
解决办法
2739
查看次数

为什么C保留goto和while,涉及尾递归

尾递归执行与goto相同的效果.或者说,在lang C中,whilegoto替换了Scheme中尾递归的作用.是什么让设计师决定在C中保留gotowhile实现?我认为人们在实际情况下几乎不会使用'goto'.

如果gotowhile要弥补C不能通过递归方式写入来实现迭代的错误,那么它们是否处于相同的特殊构造中? - 避免正常递归.(就像'cond'不同'如果'在Scheme中)这个问题是否与他们保留这两个词的原因有关?

c recursion scheme sicp

1
推荐指数
1
解决办法
1219
查看次数

SICP练习4.6:在评估程序中实现let作为基于lambda的派生表达式

我正在尝试编写一个转换let形式表达式的函数:

(let ((var1 exp1) ... (varn expn))
  body)
Run Code Online (Sandbox Code Playgroud)

转换lambda为以下形式的(等效)表达式:

((lambda (var1 ... varn) body) exp1 ... expn)

我发现该问题的大多数解决方案似乎都是错误的,有人可以确认是这种情况吗?

SICP的此解决方案为例Wiki

 ;; 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 ... …

lisp evaluation scheme functional-programming sicp

1
推荐指数
1
解决办法
431
查看次数

数字划分的类型声明

我尝试了所有可能的类型声明,但我不能使这个代码甚至编译.诀窍是处理分裂的类型.我试过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)

haskell types sicp

1
推荐指数
1
解决办法
83
查看次数

方案:从一组三个数字中返回两个最大的数字

我应该写一个函数,打印一组给定的三个数字中两个更大数字的平方和.

我笨拙地处理了这种情况.我没有编写一个函数来返回一组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)

scheme sicp

1
推荐指数
2
解决办法
2361
查看次数

`(mcons(m)'()25)16)`和`(mcons 25(mcons 16`()))之间有什么区别?

我正忙于计算机程序的结构和解释练习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)

这里appendcons …

scheme sicp cons racket cdr

1
推荐指数
1
解决办法
324
查看次数

如何在C中实现将名称与void函数关联的映射?

在阅读了计算机程序的结构和解释(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)

c functional-programming sicp

1
推荐指数
1
解决办法
121
查看次数

标签 统计

sicp ×10

scheme ×7

c ×2

functional-programming ×2

recursion ×2

cdr ×1

cons ×1

evaluation ×1

haskell ×1

lambda ×1

lisp ×1

racket ×1

types ×1