Racket函数返回总和为< =给定数字的所有数字?

时间:2016-11-20 05:41:08

标签: racket

我参加了计算机科学课程的介绍,一个问题需要我编写一个函数,该函数接受一个数字列表和一个数字,并返回列表中的数字小于给定数字的数字。我已经写了功能签名,定义和检查预期,但我已经卡住了。该函数需要假设具有lambda的中级学生。我不想在这里找到任何直接答案;只是帮助我自己能够得到答案。

我知道它需要使用递归。也许需要辅助功能。

;; sum-up-to: lon, number -> lon
;; consumes a list of numbers and a number and
;; returns the numbers in the list whose sum is
;; less than or equal to the given number

(define the-numbers (list 1 2 3 4 5 6 7 8 9))

(check-expect (sum-up-to the-numbers 7) (list 1 2 3))
(check-expect (sum-up-to the-numbers 18) (list 1 2 3 4 5))
(check-expect (sum-up-to the-numbers 45) the-numbers)

2 个答案:

答案 0 :(得分:2)

如果我们首先对列表进行排序,并且如果我们定义一个跟踪累计和的辅助函数,则可以简化此问题。这是一个骨架,用缺少的表达填充空白,你将有解决方案:

(define (sum-up-to lst n)
  (helper <???> n 0)) ; sort the input list, pass it to the helper

(define (helper lst n sum)
  (cond (<???> '())       ; if the list is empty, end the recursion
        ((> <???> n) '()) ; also end recursion if sum + current element > n
        (else
         (cons <???>         ; otherwise cons current element
               (helper <???> ; advance recursion over list
                       n
                       (+ <???> <???>)))))) ; update sum

答案 1 :(得分:0)

以下递归方法会不断将列表中的数字按顺序添加到最初为空的列表中,直到达到总和:

(define the-numbers (list 1 2 3 4 5 6 7 8 9))

(define (f lst sum)
  (let loop ((lst lst)
             (ol '()))
    (if (or (..ENTER CONDITION FOR EMPTY LIST..)
            (..ENTER CONDITION WHEN SUM IS REACHED..)
        (..ENTER HOW TO PUT THE NEW LIST OUT..)
        (loop (..ENTER ARGUMENTS TO BE SENT TO NEXT LOOP..)
        ))))

(f the-numbers 7)
(f the-numbers 18)
(f the-numbers 45)

输出:

'(1 2 3)
'(1 2 3 4 5)
'(1 2 3 4 5 6 7 8 9)