2016-11-18 107 views
0

我有一個學校的任務,我必須寫一個函數'check()',以列表作爲參數。該列表需要3個元素。列表的第一個元素應該是一個運算符,其他兩個元素應該是數據類型。函數調用的示例可能如下所示:Scheme - 自定義數據類型?

(check '(+ int int)) 

它應該在哪裏更恰當地說Int。不應該涉及任何數字。這個函數應該返回正確的輸出數據類型,具體取決於你在操作中使用的數據類型。例如:

(check '(+ int int)) 

應返回int。

它還說: 「你的程序應該認識到運營商
'+', ' - ', '*', '/', '商', '<', '>', '=', 「和」或」 和數據類型: ‘詮釋’,‘布爾’和‘真實’

試運行的一個例子可能是這樣的:

> (check '(+ int int)) 
int 
> (check '(* int bool)) 
The operator '*' does not accept bools! 
> (check '(= (< (+ int int) (quotient int int)) (> int int))) 
bool 
> (check '(* int (+ real int))) 
The operator '+' must have operands of the same numerical type! 

這個任務拉着我的令人驚訝,因爲我從來沒有真正在Scheme中製作過任何自定義數據類型,甚至不知道這是可能的。我對Scheme(和程序)總的來說)。我目前不知道從哪裏開始或做什麼!我需要定義int,bool和real嗎?我需要定義操作員嗎?如果是這樣......怎麼樣?有誰能夠幫助我?告訴我從哪裏開始或進程應該是什麼樣子......

+0

問題不一致。在一個例子中,'( - int real)'返回'real'(這很好),但是在另一個例子中,'(+ real int)'拋出一個錯誤而不是返回'real'。這可能是假的。 –

+0

@ ChrisJester-Young哦,沒有注意到。我的錯。測試運行輸出是正確的。生病編輯我的帖子。 – Schytheron

回答

0

不管你信不信,這個問題不是關於自定義數據類型的;它只是一個框架設備,讓學生考慮遞歸

從根本上說,遞歸就是把問題分解成越來越小的部分,直到你剩下最基本的部分。在這種類型檢查功能的情況下,您會遇到像(= (< (+ int int) (quotient int int)) (> int int))這樣的輸入,並且必須將其減少到像bool這樣的輸出。

分解的方法是考慮像上面那樣的大輸入等效於(= A B),其中A是(< (+ int int) (quotient int int)),B是(> int int)

然後你把A分解成(< C D),其中C是(+ int int)而D是(quotient int int)。然後你應用問題中給出的規則。特別地,適用下列規則:

  • C = (+ int int)int
  • d = (quotient int int)int
  • A = (< C D)(< int int)bool
  • B = (> int int)bool
  • (= A B)(= bool bool)bool

見減少問題小的步驟,直到你得到最基礎件(intrealbool)?簡而言之,這是遞歸的。

我希望這可以幫助您開始解決問題。

+0

你有關於如何構建它的任何提示?像我應該從哪裏開始,或者我應該如何看待這個過程? – Schytheron

+1

遞歸解決問題的關鍵是要認識到它可以分解爲一組較小的子問題,每個子問題都適用相同的通用過程,然後可以通過某種簡單的方式找到整個解決方案從這些子問題的解決方案。每個如此創建的子問題都是「較小」的,這就保證了最終的基本情況。如果我必須一路分解它,那就是我正在做所有的工作。對我而言,遞歸就是儘可能少做精神工作。讓遞歸自己找到基本情況。 –