首先,这是家庭作业,但我只是在寻找关于如何做到这一点的提示或伪代码。
我需要使用递归对列表中的所有项目求和。但是,如果它遇到列表中不是数字的内容,则需要返回空集。这是我的尝试:
(DEFINE sum-list
(LAMBDA (lst)
(IF (OR (NULL? lst) (NOT (NUMBER? (CAR lst))))
'()
(+
(CAR lst)
(sum-list (CDR lst))
)
)
)
)
这会失败,因为它无法将空集添加到其他内容中。通常我只返回0,如果它不是数字并继续处理列表。
答案 0 :(得分:4)
我建议你使用并返回一个累加器来存储总和;如果在遍历列表时发现非数字,则可以立即返回空的列表,否则递归将继续,直到列表用完为止。
沿着这些方向的东西(填空白!):
(define sum-list
(lambda (lst acc)
(cond ((null? lst) ???)
((not (number? (car lst))) ???)
(else (sum-list (cdr lst) ???)))))
(sum-list '(1 2 3 4 5) 0)
> 15
(sum-list '(1 2 x 4 5) 0)
> ()
答案 1 :(得分:3)
我会这样做:
(define (mysum lst)
(let loop ((lst lst) (accum 0))
(cond
((empty? lst) accum)
((not (number? (car lst))) '())
(else (loop (cdr lst) (+ accum (car lst)))))))
答案 2 :(得分:2)
您的问题是您需要使用cond,而不是 - 如果 - 您需要考虑三个可能的分支。第一种是如果遇到非数字,第二种是当你遇到列表的末尾时,第三种是当你需要递归到列表的下一个元素时。第一个问题是您要组合非数字大小写和空列表大小写,需要返回不同的值。递归情况大多是正确的,但您必须检查返回值,因为递归调用可以返回一个空列表。
答案 3 :(得分:1)
因为我不够聪明,无法弄清楚如何在一个函数中执行此操作,所以让我们非常明确:
#lang racket
; This checks the entire list for numericness
(define is-numeric-list?
(lambda (lst)
(cond
((null? lst) true)
((not (number? (car lst))) false)
(else (is-numeric-list? (cdr lst))))))
; This naively sums the list, and will fail if there are problems
(define sum-list-naive
(lambda (lst)
(cond
((null? lst) 0)
(else (+ (car lst) (sum-list-naive (cdr lst)))))))
; This is a smarter sum-list that first checks numericness, and then
; calls the naive version. Note that this is inefficient, because the
; entire list is traversed twice: once for the check, and a second time
; for the sum. Oscar's accumulator version is better!
(define sum-list
(lambda (lst)
(cond
((is-numeric-list? lst) (sum-list-naive lst))
(else '()))))
(is-numeric-list? '(1 2 3 4 5))
(is-numeric-list? '(1 2 x 4 5))
(sum-list '(1 2 3 4 5))
(sum-list '(1 2 x 4 5))
输出:
Welcome to DrRacket, version 5.2 [3m].
Language: racket; memory limit: 128 MB.
#t
#f
15
'()
>
我怀疑你的家庭作业期待更多学术。
答案 4 :(得分:0)
尝试制作“is-any-nonnumeric”函数(使用递归);然后你只是(或(是 - 任意数字列表)(总和列表))tomfoolery。