Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 重构列表_List_Scheme - Fatal编程技术网

List 重构列表

List 重构列表,list,scheme,List,Scheme,我正在寻找一个包含字符串和数字的列表,例如 '("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)) 我无法将括号放在正确的位置,我想知道如何才能做到这一点。有人能帮忙吗?试试这个: (define (refactor lst acc)

我正在寻找一个包含字符串和数字的列表,例如

'("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))
我无法将括号放在正确的位置,我想知道如何才能做到这一点。有人能帮忙吗?

试试这个:

(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)))))))
返回的值与预期值相同:

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

遗憾的是,我不能对奥斯卡的回答发表评论。它用负数而不是字符串分隔列表,因此会导致如下错误(在Petite Chez方案中测试,替换first->car,rest->cdr,empty?->null?以防我误解关键字):

这里有一个解决方案。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))
(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))