我一直在尝试实现一个 NFA,底部的代码是导出所有当前状态的 epsilon 闭包。我想以递归方式实现它,因为 epsilon 闭包根据定义是递归的。在当前的实现中,在主函数内部定义了一个辅助函数,使用flet,并且似乎每次递归时都独立定义了一个辅助函数。我的理解正确吗?如果是这样,在不多次定义相同内容的情况下实现此代码的最简洁方法是什么?
(defun eps-closure (states transition-rule)
(flet ((trace-eps-onestep (states transition-rule)
(remove-duplicates
(flatten
(append
states
(mapcar
(lambda (state) (transition-state state :eps transition-rule))
states))))))
(let ((next (trace-eps-onestep states transition-rule)))
(if (set-difference next states)
(eps-closure next transition-rule)
next))))
Run Code Online (Sandbox Code Playgroud)