scheme - Racket :更新列表

标签 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)

我想做的是找到除以 3 时余数为 1 的整数。 所以对于我的 list1,结果将是 '(4 7 10)。 我想将我的结果一一插入到list2中,即函数划分列表中的“newlist”。 但在代码的第 6 行,“追加”不会将我的结果插入到最新的结果中。 有人有想法吗???非常感谢!

最佳答案

在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)

关于scheme - Racket :更新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27141146/

相关文章:

lisp - Scheme 中是否有等同于 Lisp 的 "runtime"原语?

scheme - 如何在 MIT-Scheme 的条件表达式中写入标准输出?

syntax - Racket/vs - 用于标识符分隔符

scheme - Mac OS X 10.5.8 上的 Racket 6.2

racket - Racket v5.1.1 中的范围界定错误?

random - 如何在DrScheme R5RS中使用 "random"函数

concurrency - N皇后问题的Racket代码并行运行

scheme - 为什么 `not-equal?` 和类似的否定比较没有内置到 Racket 中?

scheme - 如果文件名已在列表中,则将其删除

scheme - 使用Scheme检测二进制文件中的EOF