方案编程,遍历列表并将所有内容都放在列表中

时间:2018-04-09 00:13:50

标签: list recursion recursion-schemes

家庭作业问题:

(diginlist '(4 5 3 2 8))应该返回(4(5(3)2)8)

(define(removelast L)
  (if(null?(cdr L)) '()
     (cons(car L) removelast(cdr L))))

(define(last L) (if(null?(cdr L)) (car L) (last(cdr L))))

(define(diginlist L)
  (cond((null? L) '())
       ((list?(car L)) ((diginlist(car L))
                           (list(diginlist(cdr L)))))
       (else(append(list(diginlist(cdr L)))))))

(diginlist '(4 5 3 2 8))

返回:

(list (list (list (list (list '())))))

我知道我应该使用removelast和last,但是我很难这样做。

1 个答案:

答案 0 :(得分:0)

你必须学会​​递归思考。给定问题P的一个实例,目标是构造问题R的较小实例,以便可以容易地“扩充”R的解决方案以构建P的解决方案。

一旦问题以这种方式被分解,你可以通过递归调用解决R来解决相同的程序来解决P.(

在这种情况下,P是“listify”(4 5 3 2 8)。那么什么是R?好吧,如果我们能够(5 3 2)来获得(5 (3) 2),那么我们就会处于良好的状态。 我们只需要通过使它成为3元素列表中的第二个元素来扩充这个解决方案,其中第一个元素是4,最后一个是8。

基本情况是输入为空或只有一个元素。在这些情况下,我们想要返回输入。

将它们放在一起作为伪代码:

 function listify (lst)
   if lst has 0 or 1 elements, return lst
   otherwise
     split lst into 3 parts:
       F = first element of lst
       M = a copy of lst except with first and last elements omitted
       L = last element of lst
     return a list of 3 elements: (F (listify M) L)

现在在Scheme中表达。你有一些完成。