我已经创建了一个函数,它将把一个列表插入到一个定义的emtpy列表中。我插入的列表将有某种类型的关键字来查找它(例如,名称或位置),然后是一个嵌套的列表,该列表将包含某种信息,比如调用记录的年龄或其他什么(同样,这只是我试图学习递归语法)。我的问题在于我该怎么做
例如,如果我使用我的函数向空列表添加一个名为'(John (AL 25 40 67) (CA 40 67 24))的列表,然后在一个不同的名称(如'(Sue (AZ 45 6 78)) )下添加另一个类似的列表,我如何告诉它它们本质上是存储在一个名称下的两个不同的记录。
我的第一个思考过程是遍历这个列表,直到它找到名称,然后从那里cdr和car来获取我需要查找的任何信息;但是如果我开始使用cdr和car,它会不会最终超过这个名字的记录?
(define (db_insert rec)
(set! db (cons rec db))
(display db)
(display "\n There is/are ")
(display (count))
(display " record(s) in the database"))这是我插入列表的代码
(define getName name)
[(empty? db) '()]
[(equal? (car(car db)) name) (car db)]如果它是平等的,它就会回来..。我的假设正确吗?但我怎么才能继续穿越呢?
编辑好的,这是我当前的问题。因此,我的列表或附加到空列表中的“记录”都是(Matthew (AL 21 32))格式的。现在,我正在尝试编写一个函数,该函数使用getName (我将它重命名为fetchRecord),以便找到所需的记录,然后在记录中乘以这两个数字。但是,只有在获得第一条记录上的名称时,我的当前代码才能工作,但它会返回一个空列表,用于之后的任何记录。这是我的代码:
(define (Bill_Amt name)
(cond
[(empty? db) #f]
[else
(* (car(cdr(car(cdr (fetchRecord name)))))
(car(cdr(cdr(car(cdr (fetchRecord name)))))))]))我该怎么解决这个问题?另外,如果某个记录有两组类似于这样的数据:'(John (AL 25 40) (CA 40 67)),那么您将如何使它输出25*40和40*67等,即使它有两组以上的数据?我知道这将是递归,但不太确定您将如何设置它,因为car和cdr的用法将发生变化。
发布于 2016-09-23 17:13:11
你正试图创建和操作一本字典。在Lisp中,当在list上实现时,它被称为assoc-list,因为每个条目都可以通过内置函数assoc获得。
也许你打算重新实现它,作为你学习经验的一部分.
首先,因为您用不同的名称标记条目,所以当您按下搜索的名称时,您已经找到了。想必,您不会用相同的名称标记不同的条目。当你已经用尽了你的清单,也就是达到了'()的阶段,那么你就知道你的搜索已经结束了,你还没有找到你想要的东西。
要遍历列表,只需使用car检查其第一个条目,并使用cdr处理它。
当您获得一个条目时,您可以再次使用car检查它的第一个元素名称。
在编写函数时,注意不要突然使用任何名称--使用函数中提供的参数。当然还要注意括号。
(define (get-name name db)
(cond
[(empty? db) ; end of list reached --
#f] ; use #f to signal failure
[(equal? (car (car db)) name) ; found entry with same name --
(car db)] ; return it
[else (.... name (cdr db))])) ; else go on working on the rest of the list另见:cond。
对于db-insert,遵循与遍历相同的代码大纲,并返回更新的assoc-列表。
(define (db-insert name data db)
(cond
[(empty? db) ; end of the list
(list (cons name .... ))] ; new entry, name wasn't found
[(equal? (car (car db)) name) ; same name found --
(cons .... ; an updated entry goes here
(cdr db))]
[else ; mismatch --
(cons (car db) ; preserve the current entry, and
(db-insert name data ; go on working
(......)))])) ; on the rest of the listhttps://stackoverflow.com/questions/39650598
复制相似问题