我正在尝试使用名为OpenMusic的组合工具,这是一个基于常见的lisp的图形开发环境,它使用了一种叫做“节奏树”的东西。我正在尝试使用一组规则创建节奏树,并且在OM中,此树必须具有以下结构:
给定树深n
,初始单节点树(1)
和转换规则:
它应该给:
n = 1 - > (1(1 2))
答案 0 :(得分:1)
树/列表的递归算法通常使用COND
编写。你弄清楚结局条件是什么,并把它们放在第一位。然后处理原子,最后通过递归调用其CAR
和CDR
上的函数以及CONS
结果来迭代列表,以生成输出列表。所以基本模板就像:
(defun algo (list)
(cond
((end-condition) suitable-end-value)
((atom list) (do-something-with-atom list))
(t (cons (algo (car list)
(algo (cdr list))))))
在这种情况下,这将是:
(defun rhythm-tree (n tree)
(cond ((zerop n) tree) ; First end-condition.
((null tree) '()) ; Another end-condition.
((atom tree) ; An atom: transform into...
(cons tree ; a list of the atom itself...
(list (rhythm-tree (1- n) ; and a list of children.
(case tree
(1 (list 1 2))
(2 (list 1))
(otherwise '()))))))
;; Iterate over elements of a list.
(t (cons (rhythm-tree n (car tree))
(rhythm-tree n (cdr tree))))))
(rhythm-tree 1 1)
;=> (1 (1 2))
(rhythm-tree 2 1)
;=> (1 ((1 (1 2)) (2 (1))))