2016-11-18 100 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

递归解决问题的关键是要认识到它可以分解为一组较小的子问题,每个子问题都适用相同的通用过程,然后可以通过某种简单的方式找到整个解决方案从这些子问题的解决方案。每个如此创建的子问题都是“较小”的,这就保证了最终的基本情况。如果我必须一路分解它,那就是我正在做所有的工作。对我而言,递归就是尽可能少做精神工作。让递归自己找到基本情况。 –