首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方案中的方法中创建和返回列表

在方案中的方法中创建和返回列表
EN

Stack Overflow用户
提问于 2016-06-17 23:50:46
回答 1查看 1.3K关注 0票数 1

我有一个方法,其中我想要创建一个空列表,在其中追加一些值,然后返回该列表。我的方法一直返回一个空列表。我做错了什么?

代码语言:javascript
复制
(define-struct graph (vertices edges))
(define-struct vertice (name visited))
(define-struct edge (start-vertice end-vertice length))

;I create data for testing here
(define vertices-list2
  (list (make-vertice 0 0)
        (make-vertice 1 0)
        (make-vertice 2 0)
        )
  )

(define edges-list2
  (list (make-edge 0 1 0)
        (make-edge 1 2 0)
        )
  )

(define (find-adj V edge-list)
  (let ((ret '()))
    (cond
      [(empty? edge-list) ret]
      [(eq? V (edge-start-vertice (car edge-list)))
       (begin
         (append ret '((edge-end-vertice (car edge-list))) )
         (find-adj V (cdr edge-list)))
       ]
      [else (find-adj V (cdr edge-list))]
      )
    )
  )

 (define G (make-graph vertices-list2 edges-list2))
 (find-adj 0 (graph-edges G))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-18 01:29:47

代码中有几个错误。我有一些建议:

  • 您不需要在begin中使用cond,这是隐式的。
  • 使用equal?而不是eq?,因为这是一个更一般的比较过程。
  • 您必须将append返回的值实际赋值或作为参数传递,否则将执行空操作。
  • 请务必调用edge-end-vertice,您只是附加了一个符号列表,而不是因为开头的引号而调用过程。
  • 非常重要的是:ret变量不能在每次调用过程时重新声明,否则您将在每次调用时覆盖结果。

请记住,append和所有其他列表操作都不会就地修改列表,它们只是返回一个新列表--如果您不保存它或将它作为参数传递(在本例中是首选的),您将丢失修改。最好将ret作为参数传递,因此在调用之间保留它的值-我们可以为此定义一个助手过程:

代码语言:javascript
复制
(define (find-adj V edge-list)
  (define (helper edge-list ret)
    (cond
      [(empty? edge-list) ret]
      [(equal? V (edge-start-vertice (car edge-list)))
       (helper (cdr edge-list)
               (append ret (edge-end-vertice (car edge-list))))]
      [else (helper (cdr edge-list) ret)]))
  (helper edge-list '()))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37891890

复制
相关文章

相似问题

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