【SICP练习】102 练习2.79-2.80

本文详细介绍如何在Scheme语言中实现数值的抽象处理,包括定义等值判断(equ?)和零值判断(=zero?)的通用操作,适用于常规数、有理数及复数。通过构造不同类型数值的包,展示如何利用apply-generic函数实现跨类型操作。

练习2-79

首先需要加载第125页的apply-generic函数,然后添加题中要求的通用型操作equ?。

(define (equ? x y) (apply-generic ‘equ? x y))

题目要求我们能够处理常规的数、有理数和复数。分别列出如下。

常规数:

(define (install-scheme-number-package) (define (tag x) (attach-tag 'scheme-number x)) (put 'make 'scheme-number (lambda (x) (tag x))) (put 'equ? '(scheme-number scheme-number) (lambda (x y) (= x y))) 'done)

(define (make-scheme-number n) ((get 'make 'scheme-number) n))

有理数:

define (install-rational-package)  
    (define (numer x)
        (car x))
    (define (denom x)
        (cdr x))
    (define (make-rat n d)
        (let ((g (gcd n d)))
            (cons (/ n g) (/ d g))))
    (define (tag x)
        (attach-tag 'rational x)) (put 'make 'rational (lambda (n d) (tag (make-rat n d)))) (put 'equ? '(rational rational) (lambda (x y) (and (= (numer x) (numer y)) (= (denom x) (denom y))))) 'done)

(define (make-rational n d)
    ((get 'make 'rational) n d))

复数:

(define (install-complex-package) (define (make-from-real-imag x y) ((get 'make-from-real-imag 'rectangular) x y)) (define (make-from-mag-ang r a) ((get 'make-from-mag-ang 'polar) r a)) (define (tag z) (attach-tag 'complex z)) (put 'make-from-real-imag 'complex (lambda (x y) (tag (make-from-real-imag x y)))) (put 'make-from-mag-ang 'complex (lambda (r a) (tag (make-from-mag-ang r a)))) (put 'equ? '(complex complex) (lambda (x y) (and (= (real-part x) (real-part y)) (= (imag-part x) (imag-part y))))) 'done)
(define (make-complex-from-real-imag x y) ((get 'make-from-real-imag 'complex) x y))
(define (make-complex-from-mag-ang r a) ((get 'make-from-mag-ang 'complex) r a))

练习2-80

和上一题一样,先加载第125页的apply-generic函数,然后添加题中要求的通用型操作=zero?。

(define (=zero? x) (apply-generic ‘=zero? x))

常规数:

(define (install-scheme-number-package) (define (tag x) (attach-tag 'scheme-number x)) (put 'make 'scheme-number (lambda (x) (tag x))) (put '=zero? '(scheme-number) (lambda (value) (= value 0))) 'done)
(define (make-scheme-number n) ((get 'make 'scheme-number) n))

有理数:

(define (install-rational-package) (define (numer x) (car x)) (define (denom x) (cdr x)) (define (make-rat n d) (let ((g (gcd n d))) (cons (/ n g) (/ d g)))) (define (tag x) (attach-tag 'rational x)) (put 'make 'rational (lambda (n d) (tag (make-rat n d)))) (put '=zero? '(rational) (lambda (r) (= 0 (numer r)))) 'done)
(define (make-rational n d) ((get 'make 'rational) n d))

复数:

(define (install-complex-package) (define (make-from-real-imag x y) ((get 'make-from-real-imag 'rectangular) x y)) (define (make-from-mag-ang r a) ((get 'make-from-mag-ang 'polar) r a)) (define (tag z) (attach-tag 'complex z)) (put 'make-from-real-imag 'complex (lambda (x y) (tag (make-from-real-imag x y)))) (put 'make-from-mag-ang 'complex (lambda (r a) (tag (make-from-mag-ang r a)))) (put '=zero? '(complex) (lambda (c) (and (= 0 (real-part c)) (= 0 (imag-part c))))) 'done)
(define (make-complex-from-real-imag x y) ((get 'make-from-real-imag 'complex) x y))
(define (make-complex-from-mag-ang r a) ((get 'make-from-mag-ang 'complex) r a))



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


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


版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http://blog.youkuaiyun.com/nomasp

转载于:https://my.oschina.net/nomasp/blog/503248

【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)内容概要:本文介绍了基于蒙特卡洛和拉格朗日方法的电动汽车充电站有序充电调度优化方案,重点在于采用分散式优化策略应对分时电价机制下的充电需求管理。通过构建数学模型,结合不确定性因素如用户充电行为和电网负荷波动,利用蒙特卡洛模拟生成大量场景,并运用拉格朗日松弛法对复杂问题进行分解求解,从而实现全局最优或近似最优的充电调度计划。该方法有效降低了电网峰值负荷压力,提升了充电站运营效率与经济效益,同时兼顾用户充电便利性。 适合人群:具备一定电力系统、优化算法和Matlab编程基础的高校研究生、科研人员及从事智能电网、电动汽车相关领域的工程技术人员。 使用场景及目标:①应用于电动汽车充电站的日常运营管理,优化充电负荷分布;②服务于城市智能交通系统规划,提升电网与交通系统的协同水平;③作为学术研究案例,用于验证分散式优化算法在复杂能源系统中的有效性。 阅读建议:建议读者结合Matlab代码实现部分,深入理解蒙特卡洛模拟与拉格朗日松弛法的具体实施步骤,重点关注场景生成、约束处理与迭代收敛过程,以便在实际项目中灵活应用与改进。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值