首页 > 其他分享 >sicp每日一题[2.79]

sicp每日一题[2.79]

时间:2024-11-16 13:18:27浏览次数:1  
标签:2.79 make equ sicp z1 complex 每日 z2 define

Exercise2.79

Define a generic equality predicate equ? that tests the equality of two numbers, and install it in the generic arithmetic package. This operation should work for ordinary numbers, rational numbers, and complex numbers.


这道题也挺简单的,分别在一般数字、有理数和复数包里实现这个函数就行了,以下代码复数部分在 2.77 的基础上添加,一般数字和有理数在书上 2.5.1 的基础上添加

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

; 一般数字
(put 'equ? '(scheme-number scheme-number) =)

; 有理数
(define (equ? x y)
  ;; 先化简为最简有理数
  (let ((simple-x (make-rat (numer x) (denom x)))
        (simple-y (make-rat (numer y) (denom y))))
    (and (= (numer simple-x) (numer simple-y))
         (= (denom simple-x) (denom simple-y)))))

(put 'equ? '(rational rational)
     (lambda (x y) (equ? x y)))

; 复数,只用在 install-complex-package 里添加就行
(define (equ? z1 z2)
  (and (= (real-part z1) (real-part z2))
       (= (imag-part z1) (imag-part z2))))

(put 'equ? '(complex complex)
     (lambda (z1 z2) (equ? z1 z2)))


; 测试
(install-scheme-number-package)
(define n1 (make-scheme-number 5))
(define n2 (make-scheme-number 10))
(define n3 (make-scheme-number 10))
(equ? n1 n2)
(equ? n2 n3)

(newline)
(install-rational-package)
(define r1 (make-rational 5 5))
(define r2 (make-rational 10 10))
(define r3 (make-rational 10 20))
(equ? r1 r2)
(equ? r2 r3)

(newline)
(install-rectangular-package)
(install-polar-package)
(install-complex-package)
(define z1 (make-complex-from-real-imag 3 4))
(define z2 (make-complex-from-real-imag 3 4))
(define z3 (make-complex-from-real-imag 3 5))
(equ? z1 z2)
(equ? z2 z3)

; 结果如下
'done
#f
#t

'done
#t
#f

'done
'done
'done
#t
#f

看了一下别人的答案,有理数部分可以通过十字相乘来使得答案更简单。

(define (equ? x y) 
   (= (* (numer x) (denom y)) (* (numer y) (denom x)))) 

标签:2.79,make,equ,sicp,z1,complex,每日,z2,define
From: https://www.cnblogs.com/think2times/p/18549293

相关文章

  • 每日一题之最大子段和
    给定由n个整数组成的序列a1,a2,…,an,序列中可能有负数,要在这n个数中选取相邻的子段ai,ai+1,…,aj(1≤i≤j≤n),使其和最大,并输出最大的和。例如:当{a1,a2,…,an}={1,-3,7,8,-4,12,-10,6}时,最大子段和为:sum=23。输入格式:第一行输入一个正整数N,表示序列的长度。N≤100000;第2行输入N个整数输出格式......
  • 代码随想录算法训练营day47| 739. 每日温度 496.下一个更大元素 I 503.下一个
    学习资料:https://programmercarl.com/0739.每日温度.html#算法公开课单调栈:用数组模拟单调栈,今天的题中,栈中元素都保存的索引值基本思路:将新元素和栈顶索引对应值比较,如果要保持单调递增,则需要新元素不大于栈顶索引对应值;若满足就加入新元素索引到栈中;若不满足,就根据具体题意看......
  • 每日3
    include<bits/stdc++.h>usingnamespacestd;inta[2000200];intmain(){intn,c;cin>>n>>c;for(inti=0;i<n;i++)cin>>a[i];sort(a,a+n);longlongcnt=0;for(inti=0;i<n;i++){intl=i,r=n;while......
  • sicp每日一题[2.78]
    Exercise2.78Theinternalproceduresinthescheme-numberpackageareessentiallynothingmorethancallstotheprimitiveprocedures+,-,etc.Itwasnotpossibletousetheprimitivesofthelanguagedirectlybecauseourtype-tagsystemrequiresthat......
  • 【SpringBoot每日学习 - 第二天】SpringApplication 启动类:方法篇一
    SpringApplication类是SpringBoot应用程序的核心类之一,负责启动和初始化整个SpringBoot应用。通过调用SpringApplication.run()方法,SpringBoot会启动嵌入式的Web服务器(如Tomcat)并创建Spring容器。SpringApplication类具有一系列方法和配置项,允许开发者自定......
  • 【SpringBoot每日学习 - 第一天】SpringApplication 启动类:属性篇
    SpringApplication类是SpringBoot应用启动的核心类之一,包含了大量的属性,控制着应用启动的各个方面。这些属性涵盖了从配置环境、应用上下文类型、Banner显示、启动日志、事件监听等多个方面。以下是SpringApplication类中重要属性的详细说明及其用途:静态属性DEFAUL......
  • 每日OJ题_牛客_计算字符串的编辑距离_DP_C++_Java
    目录牛客_计算字符串的编辑距离_DP题目解析C++代码Java代码牛客_计算字符串的编辑距离_DP计算字符串的编辑距离_牛客题霸_牛客网描述:Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换......
  • 每日
    includeusingnamespacestd;intmain(){intm,n,num;cin>>m>>n;intarr[999999];ints[999999];for(inti=0;i<m;i++){cin>>arr[i];}for(inti=0;i<n;i++){cin>>num;intst=0;in......
  • 每日小题--买股票的最佳时机
    目录题目  分析解题思路完整代码题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返......
  • sicp每日一题[2.77]
    Exercise2.77LouisReasonertriestoevaluatetheexpression(magnitudez)wherezistheobjectshowninFigure2.24.Tohissurprise,insteadoftheanswershegetsanerrormessagefromapply-generic,sayingthereisnomethodfortheoperationmagni......