sicp每日一题[2.1]

打印 上一主题 下一主题

主题 527|帖子 527|积分 1581

Exercise 2.1

Exercise 2.1: Define a better version of make-rat that handles both positive and negative arguments. make-rat should normalize the sign so that if the rational number is positive, both the numerator and denominator are positive, and if the rational number is negative, only the numerator is negative.
第一章学完了,本日开始学习第二章,目前还没有遇到什么题目,这道题也比力简单,只要留意到“分子分母同时为正,或者分子为负,分母为正,不需要改变符号;分子分母同时为负,或者分子为正,分母为负,分子分母都需要改变符号”这一点,就可以很容易地实现标题要求。
  1. ; (make-rat ⟨n⟩ ⟨d ⟩) returns the rational number whose numerator is the integer ⟨n⟩ and whose denominator is the integer ⟨d ⟩.
  2. (define (make-rat n d)
  3.   (let ((n (/ n (gcd n d)))
  4.         (d (/ d (gcd n d))))
  5.     ; 分子分母同时为正,或者分子为负,分母为正,不需要改变符号
  6.     ; 分子分母同时为负,或者分子为正,分母为负,分子分母都需要改变符号
  7.     (if (or (and (positive? n) (positive? d))
  8.             (and (negative? n) (positive? d)))
  9.         (cons n d)
  10.         (cons (- 0 n) (- 0 d)))))
  11. ; (numer ⟨x⟩) returns the numerator of the rational number ⟨x⟩.
  12. (define (numer x) (car x))
  13. ; (denom ⟨x⟩) returns the denominator of the rational number ⟨x⟩.
  14. (define (denom x) (cdr x))
  15. (define (add-rat x y)
  16.   (make-rat (+ (* (numer x) (denom y))
  17.                (* (numer y) (denom x)))
  18.             (* (denom x) (denom y))))
  19. (define (sub-rat x y)
  20.   (make-rat (- (* (numer x) (denom y))
  21.                (* (numer y) (denom x)))
  22.             (* (denom x) (denom y))))
  23. (define (mul-rat x y)
  24.   (make-rat (* (numer x) (numer y))
  25.             (* (denom x) (denom y))))
  26. (define (div-rat x y)
  27.   (make-rat (* (numer x) (denom y))
  28.             (* (denom x) (numer y))))
  29. (define (equal-rat? x y)
  30.   (= (* (numer x) (denom y))
  31.      (* (numer y) (denom x))))
  32. (define (print-rat x)
  33.   (newline)
  34.   (display (numer x))
  35.   (display "/")
  36.   (display (denom x)))
  37. (print-rat (make-rat -1 2))
  38. (print-rat (make-rat 1 2))
  39. (define neg-one-half (make-rat -1 2))
  40. (define one-third (make-rat 1 3))
  41. (print-rat (add-rat neg-one-half one-third))
  42. (print-rat (add-rat neg-one-half neg-one-half))
  43. (print-rat (sub-rat neg-one-half one-third))
  44. (print-rat (mul-rat neg-one-half one-third))
  45. (print-rat (div-rat neg-one-half one-third))
  46. ; 执行结果
  47. -1/2
  48. 1/2
  49. -1/6
  50. -1/1
  51. -5/6
  52. -1/6
  53. -3/2
复制代码
可以看出这里还是有改进空间,-1/1 写成 -1 就行,利用 gcd 就可以实现,不过我暂时不改了,也许后面有道标题会让做这个事变,到时间再说。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户国营

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表