球拍:更新列表

时间:2014-11-26 04:06:56

标签: scheme racket

我需要更新我的列表,但它不能很好地工作。

所以我想说我有两个清单。

(define list1 '(1 2 3 4 5 6 7 8 9 10))
(define list2 '())

1.    (define (divisionlist symbol1 symbol2 list newlist)
2.      (cond [(empty? list) null]
3.        [(equal? symbol2 (car list)) 
4.                         (divisionlist symbol1 symbol2 (cdr list) newlist)]
5.        [(equal? symbol2 (remainder (car list) symbol1)) 
6.                         (append newlist (car list)) 
7.                         (divisionlist symbol1 symbol2 (cdr list) newlist)]
8.        [else 
9.                (divisionlist symbol1 symbol2 (cdr list) newlist)]))

(divisionlist 3 1 list1 list2)

我想要做的是找到余数为1的整数,如果我除以3。 所以对于我的list1,结果将是'(4 7 10)。 我想将我的结果逐个插入到list2中,这是" newlist"在功能部门列表中。 但是在代码的第6行,"追加"不会将我的结果插入最新版本。 有人有想法???非常感谢你!

1 个答案:

答案 0 :(得分:3)

在Scheme中,列表过程就地更新列表,结果返回新列表,你必须对返回的值做一些事情 - 比如说,将其分配给变量或将其作为参数传递。我们可以做的是在调用过程时构建一个新列表,如果需要,之后将其分配给变量。例如:

(define (divisionlist symbol1 symbol2 lst) ; don't call a parameter `list`
  (cond [(empty? lst) null]
        [(equal? symbol2 (car lst))
         (divisionlist symbol1 symbol2 (cdr lst))]
        [(equal? symbol2 (remainder (car lst) symbol1))
         ; notice how we use `cons` to build a new output list
         (cons (car lst) (divisionlist symbol1 symbol2 (cdr lst)))]
        [else 
         (divisionlist symbol1 symbol2 (cdr lst))]))

(define list1 '(1 2 3 4 5 6 7 8 9 10))
(define list2 (divisionlist 3 1 list1))

现在list2将包含预期值:

list2
=> '(4 7 10)