2011-11-01 55 views
1

我期待參加與字符串和數字的列表,如重構列出

'("Ben" 95 99 100 -1 "Bob" 90 40 66 -5 "Jerry" 95 90 0) 

,並刪除了所有負數的名稱和它的後續號返回列表值的列表內的地方該列表中 - 我的例子,想要的返回值將是

(("Ben 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0)) 

我不能讓它放在括號在正確的地方,我不知道如何可以做到這一點。誰能幫忙?

+3

這肯定會幫助,如果你可以提供你如何真的要對這個問題的一些細節。代碼片段很有用,或者至少是您使用的語言。 – Ickster

回答

2

試試這個:

(define (refactor lst acc) 
    (cond ((empty? lst) (list acc)) 
     ((and (number? (first lst)) (< (first lst) 0)) 
     (cons acc (refactor (rest lst) '()))) 
     (else (refactor (rest lst) (append acc (list (first lst))))))) 

當與提供的樣本輸入測試:

(define lst '("Ben" 95 99 100 -1 "Bob" 90 40 66 -5 "Jerry" 95 90 0)) 
(refactor lst '()) 

如預期的返回值:

(("Ben" 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0)) 
0

可惜我不能發表評論奧斯卡的回答。它用負數而不是字符串分隔列表,因此會導致如下錯誤(在Petite Chez Scheme中進行測試,替換first-> car,rest-> cdr,empty? - > null?以防我誤解了關鍵字):

> (refactor '("Ben" 95 99 100 -1 "Bob" 90 -7 40 66 -5 "Jerry" 95 -5 90 0) '()) 
(("Ben" 95 99 100) ("Bob" 90) (40 66) ("Jerry" 95) (90 0)) 

這裏有一個解決方案。 acc是當前以最後一個單詞開始的子列表,在接觸下一個單詞之前跟隨非負數。

(define (refactor lst acc) 
    (cond ((null? lst) (list acc)) 
     ((and (not (number? (car lst))) (null? acc)) 
      (refactor (cdr lst) (list (car lst)))) 
     ((and (not (number? (car lst))) (not (null? acc))) 
      (cons acc (refactor (cdr lst) (list (car lst))))) 
     ((and (number? (car lst)) (< (car lst) 0) 
      (refactor (cdr lst) acc))) 
     (else (refactor (cdr lst) (append acc (list (car lst))))))) 

測試如下:

> (refactor '("Ben" 95 99 100 -1 "Bob" 90 -7 40 66 -5 "Jerry" 95 -5 90 0) '()) 
(("Ben" 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0)) 
> (refactor '("Ben" 95 99 100 -1 "Bob" 90 40 66 -5 "Jerry" 95 90 0) '()) 
(("Ben" 95 99 100) ("Bob" 90 40 66) ("Jerry" 95 90 0)) 
> (refactor '("Ben" 95 99 100 -1 "Bob" "Jerry" 95 90 0) '()) 
(("Ben" 95 99 100) ("Bob") ("Jerry" 95 90 0)) 
> (refactor '(-10 "Ben" -1 "Bob" -5 "Jerry" 0) '()) 
(("Ben") ("Bob") ("Jerry" 0)) 
+0

我認爲這可以很好地作爲答案,而不是評論。這是太多的評論信息! –