我不知道如何在列表的n位置添加元素。例如:
(insert-at new k lis)
(insert-at ’N 2 ’(a b c d e f))
=>
’(a b N c d e f)
可以吗?:
(define (insert-at new k lis)
(cond (( null? lis)
(list new))
(zero? k
(cons new lis))
(else
(cons (car lis)
(insert-at new (- k 1) (cdr lis))))))
我将给你一些提示——因为这看起来像家庭作业,我不能给你一个直接的答案,如果你自己找到解决方案会更有用。填空:
(define (insert-at new k lis)
(cond (<???> ; if the list is empty
<???>) ; return a list with the single element `new`
(<???> ; if `k` is zero
<???>) ; cons `new` with the list
(else ; otherwise
(cons <???> ; cons the lists' current element and
(insert-at new <???> <???>))))) ; advance the recursion
注意,这里"推进递归"意味着传递列表的其余部分,并将k
索引减少一个单位。一旦k
索引为零或到达列表的末端,我们就完成了。不要忘记测试这个过程:
(insert-at 'N 2 '(a b c d e f))
=> '(a b N c d e f)
(insert-at 'N 0 '(a b c))
=> '(N a b c)
(insert-at 'N 3 '(a b c))
=> '(a b c N)
如果你有两个函数:
- take-n -以列表形式返回前N个元素,
- last- N -以列表形式返回最后N个元素
那么你可以写:
(define (insert-at value index list)
(let ((len (length list)))
(assert (<= 0 index len))
(append (take-n index list)
(list value)
(last-n (- len index) list))))
(DEFUN INS-ELEM(第n项列表)
(气孔导度
((& lt;n) (ERROR "Index too small ~A" n))
((= n = 1) (CONS项目列表))
((ENDP list) (ERROR "Index too big"))
(T(缺点(第一个列表)(INS-ELEM (1 - n)项目(其他列表))))))
然后,只需调用(INS-ELEM 2 'A '(B C D E F)),然后自己查看结果。
祝你好运!
#朗拍
(define (insert-at Index item lst)
(cond
[(< Index 1) (error "Index too small: " Index)]
[(= Index 1) (cons item lst)]
[(> Index (length lst)) (error "Index too big: " Index)]
[else (cons (first lst) (insert-at (- Index 1) item (rest lst)))]))
<标题> user3660248 h1> 的想法如何解决这个问题似乎是正确的,有意义的,但你的实现在球拍是不正确的,我修复了它,现在它的工作:)
标题>