【问题标题】:OpenMusic: L-System tree generation using lispOpenMusic:使用 lisp 生成 L-System 树
【发布时间】:2016-04-21 01:17:07
【问题描述】:

我正在尝试使用一个名为 OpenMusic 的作曲工具,它是一个基于通用 lisp 的图形开发环境,它使用一种叫做“节奏树”的东西。我正在尝试使用一组规则创建节奏树,并且在 OM 中这棵树必须具有以下结构:

  • 树是一个包含两个元素的列表
  • 它的第一个元素是一个节点
  • 它的第二个元素是它的子元素列表(也可以是树)

给定树深度n、初始单节点树(1)和变换规则:

  • (1) -> (1 2)
  • (2) -> (1)

它应该给出:

n = 1 -> (1 (1 2))

【问题讨论】:

  • 那么问题出在哪里?请记住,这不是代码编写服务;)
  • 你是对的@Daniel问题是:我如何递归地定义这种行为?答案可以是简单的英语,所以没有代码服务。我不知道从哪里开始。我什至不需要答案,只要朝着正确的方向轻推就足够了。
  • @kureta 你能试着更好地解释这个问题吗?也许添加一些函数调用的示例,它们的结果以及如何达到结果(基本上写出您希望计算机执行的过程)。像现在这样,至少我无法弄清楚你想要什么。我的意思是,你从(1) 开始。根据第一条规则将其转换为(1 2)(1 2) 没有转换规则,那么您如何以 (1 (1 2)) 结束?里面的原子是否也应该被转换(但你会得到((1 2) (1)))?
  • @jkiiski 根据我上面对使用列表的树的定义,将规则应用于节点。所以单个起始节点 1 应该有两个子节点 1 和 2。这个结果树(顶部的 1 和两个子节点 1、2)表示为 (1 (1 2))。这棵树有两个端点(叶子)1 和 2。将规则应用于 1 会得到 1 和 2。将规则应用于 2 会得到 1。所以在这一步之后,树是 (1 ((1 (1 2)) (2 (1))))

标签: tree lisp common-lisp l-systems


【解决方案1】:

树/列表的递归算法通常用COND 编写。你弄清楚结束条件是什么,然后把它们放在第一位。然后处理原子,最后通过在其CARCDRCONS 上递归调用函数来迭代列表以产生输出列表。所以基本模板是这样的:

(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))))

【讨论】:

  • 非常感谢!这非常有帮助。
猜你喜欢
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 2015-03-02
  • 2014-09-03
  • 1970-01-01
相关资源
最近更新 更多