Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.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
Scheme lisp中带子列表和原子的反转列表_Scheme_Lisp - Fatal编程技术网

Scheme lisp中带子列表和原子的反转列表

Scheme lisp中带子列表和原子的反转列表,scheme,lisp,Scheme,Lisp,我是一个函数式编程新手,正在尝试用lisp反转列表。列表由子列表和原子组成。函数(反向树'((1 2)5 6(3))应返回((3)6 5(2 1))。以下是我的功能: (define (reverse-tree s) ;; giving problem with an atom (if (not(list? s)) ( reverse-tree s) (reverse (map reverse s))) ) 当我执行(反向树“((12)(3)))=>((3)(21))时,它

我是一个函数式编程新手,正在尝试用lisp反转列表。列表由子列表和原子组成。函数
(反向树'((1 2)5 6(3))
应返回
((3)6 5(2 1))
。以下是我的功能:

(define (reverse-tree s)
    ;; giving problem with an atom 
  (if (not(list? s)) ( reverse-tree s) (reverse (map reverse s)))

  )
当我执行
(反向树“((12)(3)))
=>
((3)(21))
时,它就工作了。但是当我执行
(反向树“((12)56(3)))时,它崩溃了
。我得到的错误是
reverse:预期违反合同:列表?

我仅限于使用:
反转、映射、if、cond、list?空?
函数。


编辑时,有人将此问题标记为重复,但此问题中有一个限制,与其他问题不同。我不能使用
cons
car
cdr
append
。有什么建议吗?

仔细考虑一下这个问题。首先,如果给函数一个列表作为参数,则需要反转该列表。这很简单,比如:

(define (reverse-tree tree)
  (if (list? tree)
      (reverse tree)
      ...))
但您还需要反转其中的所有子列表以及其中的所有子列表,以此类推。由于这正是我们的
reverse tree
所做的,我们应该使用
map
将其应用于反向列表中的所有元素(实际上,在反向列表之前还是之后使用
map
并不重要):

但是如果输入是
((1 2)3 4(5 6))
映射将调用原子
3
4
上的
反向树。将它们反转是没有任何意义的,因此我们可以将它们退回:

(define (reverse-tree tree)
  (if (list? tree) 
      (map reverse-tree (reverse tree))
      tree))
现在它应该起作用了:

(reverse-tree '((1 2) 3 4 (5 6)))
;=> ((6 5) 4 3 (2 1))
(reverse-tree '((1 2) 3 4 (5 6 (7 8))))
;=> (((8 7) 6 5) 4 3 (2 1))

我明白了,我的问题是我没有返回原子。谢谢
(reverse-tree '((1 2) 3 4 (5 6)))
;=> ((6 5) 4 3 (2 1))
(reverse-tree '((1 2) 3 4 (5 6 (7 8))))
;=> (((8 7) 6 5) 4 3 (2 1))