将以下内容输入到Scheme过程中。
( define Ls ( list 'Apple 'Peach 'Pear 'Plum ) )
( define NewLs ( list '***HEAD ))
这是我需要获得的输出
( define Ls ( List 'Apple 'Peach 'Pear 'Plum ) )
( define NewLs ( List '***HEAD 'Apple 'Peach 'Pear 'Plum ) )
我需要将LS中的项目附加到NewL,但一次添加一次。
我尝试过,追加,追加!设置并设置!
( define Ls ( list 'Apple 'Peach 'Pear 'Plum ) )
( define NewLs ( list '***HEAD ) )
;;;
( define Update_List
( lambda ( Ls )
( cond
(( null? Ls )
( begin
( display "\n\n ** END OF INPUT LIST *** \n\n" )
( quote() )))
( else
( begin
( append! NewLs ( car Ls ) )
( Update_List ( cdr Ls ) ) ) ) ) )
;;;
;;;
(Update_List Ls )
( exit )
我希望看到这个
NewLs ( '***HEAD 'Apple 'Peach 'Pear 'Plum )
答案 0 :(得分:2)
我想你可能会难度比它必须使它;在类似于方案的函数式编程风格中,我们使用cons
之类的函数从现有列表中派生出新列表。
此外,在以函数式编程风格进行编写时,我们通常不使用破坏性更新类型的函数,例如append!
或任何“!”功能。
您走在正确的轨道上,但请尝试从现有列表中派生新列表的方式来考虑问题:尝试编写一个函数,该函数接受两个输入列表(例如l1和l2)并生成一个列表它由l1中的所有元素组成,后跟l2中的所有元素。您上面的Update_List
函数表明,您仍在从命令式编程(包括破坏性更新)的角度考虑问题,这通常不是Scheme(以及一般的函数式编程)如何完成的。
我知道这不是您问题的直接答案,但这似乎是一项家庭作业,我希望这会给您一些提示,让您了解从哪里开始/重新开始您的解决方案。挣扎了一下得到的回答可以帮助的原则,坚持更好,你学习他们更好的方式。
我对不住你:我想你可能是一个学生在家庭作业工作,但后来我看到您的其他问题here
!我仍然鼓励您在继续阅读之前考虑一下我刚才所说的内容,因为学习是在斗争中发生的。
SO:不要试图真的很难考虑一下我上面建议之前阅读任何进一步
在这里,我将如何编写一个如上所述的函数:
(define append-lists
(lambda (l1 l2)
(cond ((null? l1) l2)) ; if l1 is empty, then l2 is the "answer"
(else
; cons-truct a new list with the (car l1)
; and the result of appending l2 to the
; rest of l1, i.e., (cdr l1)
(cons (car l1)
(append-lists (cdr l1) l2) ) ) ) ) ) )