方案总和清单

时间:2012-02-05 16:51:30

标签: recursion lisp scheme

首先,这是家庭作业,但我只是在寻找关于如何做到这一点的提示或伪代码。

我需要使用递归对列表中的所有项目求和。但是,如果它遇到列表中不是数字的内容,则需要返回空集。这是我的尝试:

(DEFINE sum-list
  (LAMBDA (lst)
    (IF (OR (NULL? lst) (NOT (NUMBER? (CAR lst))))
      '()
      (+
        (CAR lst)
        (sum-list (CDR lst))
      )
    )
  )
)

这会失败,因为它无法将空集添加到其他内容中。通常我只返回0,如果它不是数字并继续处理列表。

5 个答案:

答案 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。