我有一个方法,其中我想要创建一个空列表,在其中追加一些值,然后返回该列表。我的方法一直返回一个空列表。我做错了什么?
(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))发布于 2016-06-18 01:29:47
代码中有几个错误。我有一些建议:
begin中使用cond,这是隐式的。equal?而不是eq?,因为这是一个更一般的比较过程。append返回的值实际赋值或作为参数传递,否则将执行空操作。edge-end-vertice,您只是附加了一个符号列表,而不是因为开头的引号而调用过程。ret变量不能在每次调用过程时重新声明,否则您将在每次调用时覆盖结果。请记住,append和所有其他列表操作都不会就地修改列表,它们只是返回一个新列表--如果您不保存它或将它作为参数传递(在本例中是首选的),您将丢失修改。最好将ret作为参数传递,因此在调用之间保留它的值-我们可以为此定义一个助手过程:
(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 '()))https://stackoverflow.com/questions/37891890
复制相似问题