List 将元素追加到方案中的现有列表
我需要一些帮助来理解如何将数字附加到列表中的语法,我通过控制台从用户输入中执行此操作,因此这些元素必须以递归方式输入。因此,对于输入的任何数字,列表必须为添加的每个元素(仅数字)增长 这是我正在使用的代码,问题在于第二个条件。现在这样做很有效,但只会为我输入的每个数字创建一个空列表,因此结果将是List 将元素追加到方案中的现有列表,list,recursion,functional-programming,append,scheme,List,Recursion,Functional Programming,Append,Scheme,我需要一些帮助来理解如何将数字附加到列表中的语法,我通过控制台从用户输入中执行此操作,因此这些元素必须以递归方式输入。因此,对于输入的任何数字,列表必须为添加的每个元素(仅数字)增长 这是我正在使用的代码,问题在于第二个条件。现在这样做很有效,但只会为我输入的每个数字创建一个空列表,因此结果将是 >12 >202 >30 ()()() zero input: stopping list (define (inputlist) (let ((applist list
>12
>202
>30
()()()
zero input: stopping list
(define (inputlist)
(let ((applist list))
(let ((inpt (read)))
(cond
((= inpt 0)(newline) (display "zero input: stopping list"))
;;OLD((number? inpt) (cons inpt applist) (display (applist))(inputlist))
((number? inpt) (append (applist)(list inpt)) (display (applist))(inputlist))
(else
display "Not a number")))))
我理解为什么cons没有做我需要它做的事情,但是有没有类似的功能将每个read-in元素附加到一个预先存在的列表中
编辑:我已经接近了我需要做的事情,但仍然有相同的结果,我现在在我的应用程序列表上附加了一个通过每个输入创建的列表,尽管它仍然会产生与我输入的一样多的空列表
第二次编辑:我已经意识到为什么它要打印多个(),是因为当输入0时,它被从堆栈中调用,所以我确信它没有工作,因为附加没有按预期工作,我已经在0条件上显示了applist,它返回一个空列表。在循环时将元素附加到列表末尾的简单方法是调用
append
,然后更新对列表的引用:
(set! applist (append applist (list inpt)))
请注意,您有几个放错位置的括号-在代码中,有些缺少,有些不必要。在Scheme中,()
表示函数应用,您必须小心放在括号中
另外,请注意,append
不会修改初始列表,它会创建一个新列表,如果需要引用它,则必须将其存储在某个位置(这就是我在上面进行设置的原因!
)
你的逻辑有更严重的错误。条件的顺序错误(在询问输入是否为零之前,您必须测试输入是否为数字),并且如果输入了数字以外的内容,您忘记了循环。此外,如果我们将列表作为参数传递给循环,我们就不必进行难看的设置代码>。试试这个,它更接近你的目标:
(define (inputlist)
(let loop ((applist '()))
(let ((inpt (read)))
(cond ((not (number? inpt))
(display "not a number")
(newline)
(loop applist))
((zero? inpt)
(display "zero input: stopping list"))
(else
(let ((new-applist (append applist (list inpt))))
(display new-applist)
(newline)
(loop new-applist)))))))
正如评论中提到的,请记住,通常在循环中的列表末尾追加是一个坏主意。出于学习目的,这是可以的,但在实际代码中,您可以将cons
放在列表的开头,并在末尾将其反转,这样效率更高。注意(cons x xs)
其中x是一个元素,xs是一个列表,生成一个新的列表,其中x是它的第一个元素
下面是使用cons在列表末尾添加元素的一种方法:
例如:
将4添加到(1 2 3)
1.颠倒列表:(3 2 1)
2.将4添加到前面:(4 3 2 1)
3.反面:(1234)
使用此原则的函数:
(define (cons-to-back x xs)
(reverse (cons x (reverse xs))))
> (cons-to-back 4 (list 1 2 3))
(1 2 3 4)
另一种方法是使用append
,它附加两个列表的元素:
> (append '(1 2 3) '(4 5 6))
(1 2 3 4 5 6)
我们只需在使用append之前将元素添加到列表中:
> (append '(1 2 3) (list 4))
'(1 2 3 4)
背面的cons的替代定义
:
(define (cons-to-back x xs)
(append xs (list x)))
如果我在applist周围没有括号,我会被抛出错误,因为inpt和applist不在同一时间,或者至少其中一个被调用,换句话说,我在调用变量或列表时很难准确地理解我在抛出什么,我得到这个错误是因为它的列表或阅读或什么,你有,这是由于过多的括号?我做错了什么?@James I用正确的解决方案更新了我的答案,但是你必须花更多的时间阅读教程和文档,你在一些基本概念上仍然有问题。你会推荐什么教程?@scarLópez在循环中使用(append lst(list x))
可能是个好主意,一般来说,一个反模式,更好的模式是在循环中使用(cons x lst)
,然后反转。
(define (cons-to-back x xs)
(append xs (list x)))