SICP 习题2.1 make-rat 处理整数和负数版本

SICP 习题 (2.1) 解题总结:用复合数据表示有理数 SICP 习题 2.1 要求我们做一个可以正确处理正数和负数的make-rat过程,用于生成一个有理数。条件是分母必须是正数。完成这道题本身比较简单,就是简单修改一下书中的make-rat过程就可以了。书中原本的make-rat过程如下:(define (make-rat n d) (cons n d)) 可以发现,原来的make-rat就是简单地将n和d组成一个序对,然后返回这个序对,并没有对 阅读详情
(define make-rat
  (lambda (n d) 
    (let ((n1 (if (or (and (> n 0) (< d 0)) (and (< n 0) (> d 0))) -1 1))
      (d1 1)
      (n2 (if (> n 0) n (* -1 n)))
      (d2 (if (> d 0) d (* -1 d))))
        (let ((g (gcd n2 d2)))
      (cons (* n1 (/ n2 g)) (* d1 (/ d2 g)))))))

(define (print-rat x)
  (newline)
  (display (numer x))
  (display "/")
  (display (denom x)))

(define numer car)
(define denom cdr)

(define one-half (make-rat 1 2))

(print-rat one-half)
(print-rat (make-rat 2 -3))
(print-rat (make-rat -2 3))
(print-rat (make-rat -2 -3))
光纤布拉格光栅(FBG)笔记【1】:波导结构和布拉格波长推导 引言 本文是光纤布拉格光栅(FBG)的笔记【1】,主要介绍了光纤布拉格光栅的波导结构,并且利用动量和能量守恒推导了光纤布拉格波长的表达式 普通光纤中让折射率发生周期性变化就是结构最简单的均匀光纤布拉格光栅(FBG),其波导结构如下图所示。 其传感原理描述可以分为以下的三点: ①光纤纤芯传播的光会在每个光栅面进行反射和透射; ②如果不满足布拉格条件,依次排列的光栅平面反射的光会逐渐变得不同直到最后相互抵消;同时由于系数不匹配,与布拉格波长不相符的光在每个光栅平面的反射也很微弱,这些光大部分在光纤中发生透. 阅读详情

相关推荐

AD2S1210与DSP28335 SPI通信中的GPIO配置陷阱与解决

本文深入剖析了AD2S1210与DSP28335进行SPI通信时,因GPIO输入限定配置不当导致数据整体右移的典型问题。文章指出,错误地将MISO引脚配置为带采样周期的同步模式是根本原因,并提供了将输入选择限制正确设置为异步模式的解决方案。同时,总结了不同应用场景下GPIO输入限定的配置原则,为高速同步通信的稳定实现提供了关键指导。

weixin_29163857的博客 146

2.1.1 例子:有理数的算术操作

2.1.1 例子:有理数的算术操作 假定我们要实现有理数的算术。我们要能够做加法,减法,乘法,和除法,以及测试 两个数是否相等。 让我们开始假定我们已经有一种方式从分子和分母组装起一个有理数。我们也假定 给定一个有理数,我们有一种方式抽取出它的分子和分母。让我们进一步地假定 组合子和选择子都是可用的,如下的程序: (make-rat &lt;n&gt; &lt;d&gt;) 返回一个有理数,它...

红孩儿编程大师 764

电脑版微信多开,最详细教程没有之一

首先桌面任意的位置右键新建文本文档输入如下代码: TASKKILL /F/IM WECHAT.EXE start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" start " " "D:\Program Files (x86)\Tencent\WeChat\WeChat.exe" ...

大超子 4389

欢迎使用优快云-markdown编辑器

第一次写博客,还有点小激动呢(>_<)…sicp 10天前开始读,昨天刚把第一章读完,46道题也全部做完,收获颇大。 练习2.1 定义出make-rat的一个更好的版本,使之可以同时处理。有理数为正时, make-rat应该使其规范化,使它的分子分母都为正。如果为负则只让它的分子为负。这道题总体来说比较简单,在make-rat里进行一次判断就可以了。(define (make-rat n d

tang17780603904的博客 209

傅里叶变换实战:用Python手把手教你分析音频频谱(附完整代码)

本文详细介绍了如何使用Python实现傅里叶变换进行音频频谱分析,涵盖音频加载、预处理、FFT应用、频谱可视化及特征提取等关键步骤。通过实战案例和完整代码,帮助开发者掌握数字信号处理技术,特别适合音频分析和音乐信息检索领域的应用。

weixin_29090677的博客 150

three.js 载入 3D 模型的方法

三维模型的加载器ColladaLoader模型加载器。GLTFLoader模型加载器。OBJLoader模型加载器。FBXLoader模型加载器。

w418856的博客 4361

Scheme语言直译为汉语(十)

一、有理数运算 接下来,我们要用一个有理数运算的例子来感受需要进一步抽象的程序要如何来设计。 作为开始,我们假定已经有了一种从分子和分母构造有理数的方法。并进一步假定, 如果有了一个有理数,我们有一种方法取得(选出)它的分子和分母。现在再假定有关的构造函数和选择函数都可以作为过程使用: (make-rat ) 返回一个有理数,其分子是整数<n>,分母是整数<d>。 (numer <x>) 返回有理数<x>的分子。 (denom <x>) 返回有

qq_43071318的博客 327

大聪明教你学Java | Seata 2.5 从下载到运行:全流程编译部署教程

Seata 2.5 版本带来了不少特性优化,但实际部署时却发现一个尴尬问题:全网找不到一篇完整覆盖「Git 源码下载→本地编译→环境配置→启动验证」的实操教程。作为一名踩遍无数坑才成功跑通的开发者,我深知这个过程的煎熬:Git 拉取源码后编译失败、依赖版本冲突、配置文件参数混乱、启动时端口占用或连接报错… 每一个坑都能耗费数小时排查。为了让后续开发者少走弯路,我将自己从0到1的完整实操经验整理成文,跟着步骤走即可成功运行 Seata 2.5.

不肯过江东丶 2071

SICP-练习2.1

【练习2.1】 请定义出make-rat的一个更好的版本,使之可以正确处理整数和负数。当有理数为正时,make-rat应当将其规范化,使它的分子和分母都是正的。如果有理数为负,那么就应只让分子为负。 【分析】 分子、分母的符号总共有四种情况: 1. 分子、分母都为正数, 2. 分子为负数,分母为正数。 这两种情况下,输入和输出一致。 3. 分子、分母都为负数, 4. 分子为正数,分

jjjcainiao的专栏 699

MTK-Android12开机应用自启需求-自定义原生Launcher3 主界面布局图标

MTK平台 Android12 版本 上实现 开机应用自启需求-自定义原生Launcher3 主界面布局图标。添加一个属性定义即可,如下:这里自定义一个属性目的是为了在加载Launcher3启动时候从属性获取需要自启动应用的包名,可以扩展动态替换 自启动包名。这里有两种方案,要么在Launcher3里面实现,要么在系统服务里面在开机时候启动第三方一次。这里强烈建议在Launcher3中去实现,体验效果更好。// 第一步:定义属性,// 第二步:在onCreate 方法中获取属性并启动应用。

十年饮冰,难凉热血 1374

Python 安装 PyTorch(GPU)详细教程

本章教程,介绍如何安装PyTorch GPU版本的具体教程。

猿小白的博客 1613

SICP 习题2.19 重写count-change 过程

(define (cc amount coin-values) (cond ((= amount 0) 1) ((or (< amount 0) (no-more? coin-values)) 0) (else (+ (cc amount (except-first-denomination coin-values)) (cc (

NM的专栏 1222

如何在 DevOps 管道中实现 AI?

AI与DevOps的融合(AIOps)正在重塑软件开发生命周期。本文系统阐述了AI在DevOps中的五大应用场景:智能监控、自动化测试、安全防护、CI/CD优化和事件管理,并提出了六步实施框架:痛点识别、工具选型、流程集成、智能监控、MLOps和治理合规。通过Netflix、Google等企业的实践案例,验证了AI在提升部署效率(降低40%故障率)、缩短问题解决时间(MTTR减少60%)方面的显著价值,同时指出数据质量、模型偏差等实施挑战。研究表明,战略性地

介绍AWS Azure GCP devops Terraform 等技术 497

SICP 练习1.35使用不动点发寻找黄金分割律

前几个输出是书上介绍不动点法的几个样例(define tolerance 0.00001)(define (fixed-point f first-guess) (define (close-enough? v1 v2) (< (abs (- v1 v2)) tolerance)) (define (try guess) (let ((next (f guess)))

NM的专栏 1107

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

SICP 习题2.8 区间减法

我的想法是区间减法是a区间的每一个数减去b区间的每一个数,这些相减的结果在一个区间上。也就是x的下界-y的上界是最小的,x的上界-y的下界是最大的。其他所有结果都在这两个数之间。(define (add-interval x y) (make-interval (+ (lower-bound x) (lower-bound y)) (+ (upper-bound x) (upp

NM的专栏 1043

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

SICP 牛顿法求平方根

(define (sqrt-iter guess x) (if (good-enough? guess x) guess (sqrt-iter (improve guess x) x)))(define (improve guess x) (average guess (/ x guess))) (define (average x y) (/ (+ x y) 2))(d

NM的专栏 971

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SICP 习题2.3 计算矩形面积和周长

我是用两个点表示的一个矩形,矩形的左下方的点和右上方的点。还有一种方法可以用一个左下方的点,一个长,一个宽就可以了。建立抽象屏障就是要求每个表示方法都能求出一个矩形的长和宽,根据这两个信息,就可以求出矩形面积和周长。(define make-rect cons) (define s-rect car) (define e-rect cdr)(define make-point cons) (defi

NM的专栏 828

SICP 习题1.36 使用不动点发寻找x^x = 1000的根

修改fixed-point过程,在let里修改即可(define tolerance 0.00001)(define (fixed-point f first-guess) (newline) (display first-guess) (define (close-enough? v1 v2) (< (abs (- v1 v2)) tolerance)) (define (

NM的专栏 814

SICP 换零钱问题

书上提到了迭代的算法,想到了完全背包,但是lisp功底太差,实现不了。(define (count-change amount) (cc amount 5))(define (cc amount kinds-of-coins) (cond ((= amount 0) 1) ((or (< amount 0) (= kinds-of-coins 0)) 0) (

NM的专栏 809

SICP 习题2.42 八皇后问题

想不到第一次写八皇后问题是用的scm写代码的途中遇到一个错误,用let错了,用define对了,应该是编译器的原因,和nil差不多。(define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr

NM的专栏 764

SICP 习题2.33 用accumulate完成一些基本的表操作

这个accumulate比第一章完成更强大(define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence)))))(define (map p sequence) (accu

NM的专栏 735

SICP 练习1.7

这个是改进good-enough?函数,容易想到,guess (improve guess x) 分别是上一次迭代和下一次迭代的结果,那么就可以测量这个变化来改进good-enough?函数(define (sqrt-iter guess x) (if (good-enough? guess (improve guess x)) guess (sqrt-iter (improve

NM的专栏 734

SICP 习题2.4 cons car cdr 用过程实现

(define (cons-a x y) (lambda (m) (m x y)))(define (car-a z) (z (lambda (p q) p)))(define (cdr-a z) (z (lambda (p q) q)))(define a (cons-a 1 2)) (newline) (display (car-a a)) (newline) (display (c

NM的专栏 702

SICP 习题2.36 accumulate-n的实现

(define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence)))))(define (accumulate-n op init seqs) (if (null? (car

NM的专栏 691

SICP 练习2.34 多项式求值(horner规则)

(define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence)))))(define (horner-eval x coefficient-sequence) (accum

NM的专栏 665

SICP 习题2.7 实现区间的lower-bound 和 upper-bound

lower-bound 就是 carupper-bound 就是 cdrmake-interval 需要保证lower-bound 小于 upper-bound(define (add-interval x y) (make-interval (+ (lower-bound x) (lower-bound y)) (+ (upper-bound x) (upper-bound

NM的专栏 650
上一篇: SICP 习题1.46 iterative-improve
下一篇: SICP 习题2.2 线段的中点
_NMfloat_
博客等级 码龄12年 7粉丝 315原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值