Racket:结构条目的数学运算

时间:2014-05-13 03:40:15

标签: structure racket

我今天开始学习球拍,所以请耐心等待:)

我尝试的是对结构中存储的数字(在这种情况下为年龄)求和。 所以我有这个:

(define-struct rec (name age)) ; defining the struct of records

(define r1 (make-rec "Joe" 23))
(define r2 (make-rec "Sue" 13))
(define r3 (make-rec "Ann" 44))

(define reclist (list r1 r2 r3)) ; defining a list of records

我发现了如何对整数求和,这似乎是一个很好的方法:

(define liste (list 1 2 3 4 5))
(define (sum-list l)
  (cond
    [(empty? l) 0]
    [(+ (first l) (sum-list (rest l)))]))

现在,我一直在尝试以某种方式组合这些功能,我可以抓住每个记录中的年龄,然后将它们总结,但无济于事。我尝试了不同的循环结构,但问题是它永远不会返回值而是返回过程名称。

我知道,我在这里遗漏了一些非常基本的东西,但我还是被卡住了。

2 个答案:

答案 0 :(得分:3)

由于您的sum-list功能仅对数字起作用,因此您需要将rec列表投影到数字列表中。这可以使用map函数完成。表达式(map rec-age reclist)将为您生成数字列表。

答案 1 :(得分:0)

更改代码:

(define (sum-list lst . lkey)
  (define key (if (null? lkey) values (car lkey)))
  (cond
    [(empty? lst) 0]
    [(+ (key (first lst)) (sum-list (rest lst) key))]))

备用尾递归版

(define (sum-list lst . lkey)
  (define key (if (null? lkey) car (compose (car lkey) car)))
  (let loop ((acc 0) (lst lst))
    (if (null? lst)
        acc
        (loop (+ acc (key lst)) 
              (cdr lst)))))

在一个blob中替换更高阶的过程版本:

(define (sum-list lst . lkey)
  (define key (if (null? lkey) values (car lkey)))
  (foldl (lambda (x acc)
           (+ acc (key x)))
         0 
         lst))

使用map获取值并应用:

(define (sum-list lst . lkey)
  (apply +
         (if (null? lkey) 
             lst 
             (map (car lkey) lst))))

对于许多元素,这可能更有效:

(define (sum-list lst . lkey)
  (foldl +
         0
         (if (null? lkey) 
             lst 
             (map (car lkey) lst))))

所有工作都是这样的:

(sum-list '(1 2 3 4))          ; ==> 10
(sum-list '((1)(2)(3)(4)) car) ; ==> 10
(sum-list reclist rec-age)     ; ==> 80