首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

SICP 習題 2.1 解析:有理數構造與數據抽象本質

     編輯:C++ 入門

SICP 習題 2.1 解析:有理數構造與數據抽象本質

習題要求:修改 make-rat,使分母始終為正。若輸入分母為負,同時取分子分母相反數。

原始代碼與修正

; 原版:僅構造序對
(define (make-rat n d) (cons n d))

; 修正版:規範化符號
(define (make-rat n d)
  (if (< d 0)
      (cons (- n) (- d))
      (cons n d)))

深度思考:為什麼要自己實現有理數?

Scheme 內建支持有理數,但 SICP 旨在教導如何從零構建抽象層。如同鐵匠師父讓徒弟用鐵錘打鐵錘——不是缺工具,而是練習「構造工具的工具」能力。這是理解編程語言本質的關鍵路徑。

為什麼用 cons 構造序對?

  • Lisp/Scheme 中 cons 是唯一基本數據構造原語
  • 序對 = cons 連接的兩個值,car 取首,cdr 取尾
  • 列表、樹、表等所有復雜結構最終都由序對構成
  • cons 如「線」,基本數據如「點」,線連點構成任意拓撲

關鍵概念

  • 數據抽象:將「如何表示」與「如何使用」分離。make-rat、numer、denom 構成抽象屏障
  • 序對:最基本的膠水。car/cdr 名源自 IBM 704 指令集(Contents of Address/Decrement Register)
  • 遞歸數據結構:序對的 car/cdr 可以又是序對,形成遞歸定義

啟示

掌握 cons/car/cdr 即掌握了 Lisp 族語言構建任意數據結構的核心。後續章節將展示如何用序對構建列表、樹、隊列、圖等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved