2012-11-11 79 views
0

我真的很困惑如何做到这一点......我什至不知道如何开始,我知道如何做一个二叉树,但我希望能够用任何形式的嵌套列表来做到这一点,任何人都可以帮助我吗?返回嵌套列表的嵌套深度n上的所有元素

+0

我希望它像一个列表工作: (1(2(3 4)5 6 7(8(5 6)9))) – Daquicker

回答

2

对于这一个,你需要使用模板遍历任意嵌套的元素列表。例如,研究这个复制任意嵌套列表的程序:

(define (copy lst) 
    (cond ((null? lst)    ; if list is empty 
     '())      ; return the empty list 
     ((not (list? (car lst))) ; if current element is not a list 
     (cons (car lst)   ; cons current element 
       (copy (cdr lst)))) ; with the rest of the list 
     (else      ; if current element is a list 
     (cons (copy (car lst))  ; cons recursive call over current element 
       (copy (cdr lst)))))) ; with recursive call over rest of the list 

先有一点约定。假设1是基本级别,并且返回的所有元素都将位于平面输出列表中(不保留输入列表的原始结构)。例如:

(elements-level '(1 2 3) 1) 
; => '(1 2 3) 

(elements-level '(1 (2) 3) 2) 
; => '(2) 

考虑到上面的模板,让我们看看如何修改它解决手头的问题。我会让你填写的空白,因为这个问题看起来像功课:

(define (elements-level lst lvl) 
    (cond ((or (null? lst) (< lvl 1))  ; if list is empty or below level 
     '())        ; return the empty list 
     ((not (list? (car lst)))   ; if current element is not a list 
     (if (= lvl <???>)     ; if `lvl` is the base level 
      (cons <???>     ; cons current element in list 
       (elements-level <???> lvl)) ; and advance recursion over cdr part 
      (elements-level <???> lvl))) ; else advance recursion over cdr part 
     (else        ; if current element is a list 
     (append       ; use `append` for flattening the list 
      (elements-level <???> <???>)  ; recur over car, decrease one level 
      (elements-level <???> <???>))))) ; recur over cdr, keep the same level 

测试与此列表中的程序,它必须为1水平,'(2)回到'(1)2水平,等等:

(elements-level '(1 (2 (3 (4 (5))))) 1) 
; => '(1) 
+0

随着我填补了空白它适用于你的例子,但不是我的例子,我使用此列表: '(leeg(leeg(ster)(leeg))(bal))(ster(ster)( (kaars)(leeg))(bal))(kaars(bal)(leeg(leeg)(ster))(kaars(leeg)(leeg))))) – Daquicker

+0

该列表的预期输出是什么?为什么级别? –

+0

首先lvl为0,它应该返回lvl 2:(leeg,bal,ster,leeg,bal,bal,leeg,kaars) – Daquicker

0

我认为你可以使用递归与步骤如下:

  1. 定义列表,以保持在第n个深度的所有元素。
  2. 创建一个递归函数,该函数nested listnew listn作为参数
  3. 对于嵌套循环中的每个元素,通过使子列表和深度为n-1个调用递归函数本身。
  4. nested list的所有元素添加到new list当n = 0

一旦这个方法执行完毕后,你会在new list深度n的所有元素。

可能增强: 如果有可能的一些列表中的元素不会延伸至第n级,那么你可能想调用递归方法之前检查元素的类型。如果它是leaf类型的,那么只需将该元素添加到新列表中。

+0

由于FR的评论,但我真的不明白如何代码你说什么,这是我会做的,但我确定它不会工作(定义(rec nestedlst newlst n) (if(= n 0) nestedlst (cond((null? nestedlst) ((atom_ nestedlst)nestedlst) (else(append(rec(car nestedlst)newlst( - n 1)) (rec(cdr nestedlst)newlst( - n 1))))))) – Daquicker

+0

@Daquicker:哪一部分你没有得到,哪一个你认为不行? –