首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归学习方案中的问题

递归学习方案中的问题
EN

Stack Overflow用户
提问于 2016-09-22 23:59:59
回答 1查看 78关注 0票数 0

我已经创建了一个函数,它将把一个列表插入到一个定义的emtpy列表中。我插入的列表将有某种类型的关键字来查找它(例如,名称或位置),然后是一个嵌套的列表,该列表将包含某种信息,比如调用记录的年龄或其他什么(同样,这只是我试图学习递归语法)。我的问题在于我该怎么做

  • 遍历更大的列表
  • 让程序知道一个更大的列表中有几个列表,以及如何区分它们。

例如,如果我使用我的函数向空列表添加一个名为'(John (AL 25 40 67) (CA 40 67 24))的列表,然后在一个不同的名称(如'(Sue (AZ 45 6 78)) )下添加另一个类似的列表,我如何告诉它它们本质上是存储在一个名称下的两个不同的记录。

我的第一个思考过程是遍历这个列表,直到它找到名称,然后从那里cdrcar来获取我需要查找的任何信息;但是如果我开始使用cdrcar,它会不会最终超过这个名字的记录?

代码语言:javascript
复制
(define (db_insert rec)
  (set! db (cons rec db))
  (display db)  

  (display "\n There is/are ")
  (display (count))
  (display " record(s) in the database"))

这是我插入列表的代码

代码语言:javascript
复制
(define getName name)
  [(empty? db) '()]
  [(equal? (car(car db)) name) (car db)]

如果它是平等的,它就会回来..。我的假设正确吗?但我怎么才能继续穿越呢?

编辑好的,这是我当前的问题。因此,我的列表或附加到空列表中的“记录”都是(Matthew (AL 21 32))格式的。现在,我正在尝试编写一个函数,该函数使用getName (我将它重命名为fetchRecord),以便找到所需的记录,然后在记录中乘以这两个数字。但是,只有在获得第一条记录上的名称时,我的当前代码才能工作,但它会返回一个空列表,用于之后的任何记录。这是我的代码:

代码语言:javascript
复制
(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*4040*67等,即使它有两组以上的数据?我知道这将是递归,但不太确定您将如何设置它,因为carcdr的用法将发生变化。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-23 17:13:11

你正试图创建和操作一本字典。在Lisp中,当在list上实现时,它被称为assoc-list,因为每个条目都可以通过内置函数assoc获得。

也许你打算重新实现它,作为你学习经验的一部分.

首先,因为您用不同的名称标记条目,所以当您按下搜索的名称时,您已经找到了。想必,您不会用相同的名称标记不同的条目。当你已经用尽了你的清单,也就是达到了'()的阶段,那么你就知道你的搜索已经结束了,你还没有找到你想要的东西。

要遍历列表,只需使用car检查其第一个条目,并使用cdr处理它。

当您获得一个条目时,您可以再次使用car检查它的第一个元素名称。

在编写函数时,注意不要突然使用任何名称--使用函数中提供的参数。当然还要注意括号。

代码语言:javascript
复制
(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-列表。

代码语言:javascript
复制
(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 list
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39650598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档