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_Recursion_Functional Programming_Append_Scheme - Fatal编程技术网

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)))