【SICP练习】98 练习2.73

简介:

练习2.73

a小题,这是由于Scheme对数字、变量的直接规定,前者会被当作数值类型,后者则会被当作符号类型。因此没必要将这两个谓词添加到数据导向分派中了。如果给数值类型或者符号类型加上一个标志,在get的过程中,又对已知的类型做判断,岂不是在浪费空间和时间。
b小题,我们根据书中已有的范例来完成这道题,也即是第123页最下面到第125页最上面的内容。

(define (install-sum-package)
  (define (addend s) (car s))
       (define (augend s) (cadr s))
       (define (make-sum x y)
          (cons ((=number? x 0) y)
 ((=number? y 0) x)
                ((and (number? x) (number? y))
                 (+ x y))
               (else
                 (attach 'add x y))))
      (put 'addend 'add addend)
      (put 'augend 'add augend)
      (put 'make-sum 'add make-sum)
  (put 'deriv 'add
           (lambda (exp var)
               (make-sum (deriv (addend exp) var)
                   (deriv (augend exp) var))))
      'done)
;Value: install-sum-package
(define (make-sum x y)
  ((get 'make-sum 'add) x y))
;Value: make-sum
(define (addend sum)
  ((get 'addend 'add) (contents sum)))
;Value: addend
(define (augend sum)
  ((get 'augend 'add) (contents sum)))
;Value: augend
(install-sum-package)
;Unbound variable: put
;To continue, call RESTART with an option number:
; (RESTART 8) => Specify a value to use instead of put.
; (RESTART 7) => Define put to a given value.
; (RESTART 6) => Return to read-eval-print level 6.
; (RESTART 5) => Return to read-eval-print level 5.
; (RESTART 4) => Return to read-eval-print level 4.
; (RESTART 3) => Return to read-eval-print level 3.
; (RESTART 2) => Return to read-eval-print level 2.
; (RESTART 1) => Return to read-eval-print level 1.
;Start debugger? (y or n): n

直到写到了这一步,我才发现put没有定义并且不会定义。因此这道题,我曾搁置下来直到通过后面的学习写出了put和get。

(define operation-table (make-table))
(define put (operation-table ‘insert-proc!))
(define get (operation-table ‘lookup-proc))

其中的put中的insert-proc加上一个感叹号,是因为Scheme中的规范——对有破坏性的操作加上”!”。而make-table则在书上第186页及187页有定义,没有学过不要紧,这里就再来用一次传说中的按愿望思维。
b小题中还要求我们写出关于积式的求导过程,然后也要安装到表格之中。

(define (install-product-package)
    (define (multiplier p) (car p))
    (define (multiplicand p) (cadr p))
    (define (make-product x y)
        (cond ((or (=number? x 0) (=number? y 0)) 0)
               ((=number? x 1) y)
               ((=number? y 1) x)
               ((and (number? x) (number? y))
                (* x y))
               (else
                (attach-tag ‘mul x y))))
      (put ‘multiplier ‘mul multiplier)
      (put ‘multiplicand ‘mul multiplicand)
      (put ‘make-product ‘mul make-product)
          (put ‘deriv ‘mul 
              (lambda (exp var)
                  (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var))
                              (make-product (deriv (multiplier exp) var) (multiplicand exp)))))
          ‘done)
     (define (make-product x y)
         ((get ‘make-product ‘mul) x y))
     (define (multiplier product)
          ((get ‘multiplier ‘mul) (contents product)))
       (define (multiplicand product)
           ((get ‘multiplicand ‘*) (contents product)))

注意之前的attach-tag在这里并不适用,因为其要传入的参数除了一个操作符之外有两个操作对象而不再是一个。

(define (attach-tag type-tag x y)
(list type-tag x y))
(define (type-tag datumn)
(car datumn))
(define (type-tag datumn)
(cdr datumn))

这真是一道漫长的题目哎,c小题参照前面两段代码写起来应该很容易的,如果不知道怎么做乘幂的这个算法,在练习2.56中我们已经遇到过了。
最后一题呢,题目给出了另一种的get形式,但是已经写好的包就不必再加以修改了,因为直接改put即可了。而get中所修改的也只是顺序罢了。因此put的改法也只是改改顺序。

(put ‘make-sumadd make-sum)
(putadd ‘make-sum make-sum)

前面一个是之前写好的,后面一个是这个小题中改过之后的。



感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp


目录
相关文章
|
2天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
128805 24
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
5天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
16089 37
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
4天前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
1163 8
|
13天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
3328 117
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
8天前
|
人工智能 自然语言处理 API
DeepSeek全尺寸模型上线阿里云百炼!
阿里云百炼平台近日上线了DeepSeek-V3、DeepSeek-R1及其蒸馏版本等六款全尺寸AI模型,参数量达671B,提供高达100万免费tokens。这些模型在数学、代码、自然语言推理等任务上表现出色,支持灵活调用和经济高效的解决方案,助力开发者和企业加速创新与数字化转型。示例代码展示了如何通过API使用DeepSeek-R1模型进行推理,用户可轻松获取思考过程和最终答案。
|
5天前
|
人工智能 自然语言处理 程序员
如何在通义灵码里用上DeepSeek-V3 和 DeepSeek-R1 满血版671B模型?
除了 AI 程序员的重磅上线外,近期通义灵码能力再升级全新上线模型选择功能,目前已经支持 Qwen2.5、DeepSeek-V3 和 R1系列模型,用户可以在 VSCode 和 JetBrains 里搜索并下载最新通义灵码插件,在输入框里选择模型,即可轻松切换模型。
835 14
|
12天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
1856 9
阿里云PAI部署DeepSeek及调用
|
9天前
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。
|
11天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。

热门文章

最新文章