recursive-graph-body-print函数 graph-body-print 也可以使用递归的方式来实现。递归解决方案分为两部分:一个外部包装器,它使用 let 表达式确定一些变量的值,这些变量只需找到一次,例如图形的最大高度;以及一个内部函数,该函数被递归调用以打印图形。
外部包装器比较简单:
(defun recursive-graph-body-print (numbers-list)
"打印 NUMBERS-LIST 的条形图。"
(let ((height (apply 'max numbers-list))
(symbol-width (length graph-blank))
from-position)
(recursive-graph-body-print-internal
numbers-list
height
symbol-width)))
递归函数稍微复杂一些。它分为四个部分:再次执行测试、打印代码、递归调用和下一步表达式。再次执行测试是一个 when 表达式,用于确定 numbers-list 是否包含任何剩余元素;如果包含,则该函数使用打印代码打印图的一列,并再次调用自身。函数再次调用自身的依据是下一步表达式产生的值,该值导致调用作用在 numbers-list 的较短版本上。
(defun recursive-graph-body-print-internal (numbers-list height symbol-width) "打印条形图,在 recursive-graph-body-print 函数中使用。"
(when numbers-list
(setq from-position (point))
(insert-rectangle
(column-of-graph height (car numbers-list)))
(goto-char from-position)
(forward-char symbol-width)
(sit-for 0) ; 逐列绘制图形。
(recursive-graph-body-print-internal
(cdr numbers-list) height symbol-width)))
安装完成后,可以测试此表达式;以下是一个示例:
(recursive-graph-body-print '(3 2 5 6 7 5 3 4 6 4 3 2 1))
这是 recursive-graph-body-print 生成的结果:
*
** *
**** *
**** ***
* *********
************
*************
这两个函数之一,graph-body-print 或 recursive-graph-body-print,都可以创建图形的主体。