2016-11-20 68 views
0

我正在參加計算機科學課程的介紹,有一個問題需要我編寫一個函數,該函數需要一個數字和一個數字的列表,並返回列表中總和小於給定數字的數字。我寫了函數簽名,定義和檢查期望,但我卡住了。該函數需要假設帶有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) 
+0

我們可以假設,輸入列表是按升序排序?如果不是,我們可以使用現有的分揀程序嗎? –

+0

是,升序排列。它只返回列表中總和小於或等於給定數字的第一個數字。 –

+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

下面的遞歸方法不斷增加,從列表順序號到初始爲空OUTLIST,直到達到總和:

(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) 
+0

OP特別聲明,他並不「想要任何直接的答案」...... –

+0

我修改了上面的答案。 – rnso

相關問題