我正在尝试用Sightly实现递归算法来解决汉诺塔问题。我知道这种方法可能没有很明显的实际应用,但我将其视为一种谜题。最终我得到了以下代码:
<sly data-sly-template.step="${@ n, src, aux, dst}" data-sly-unwrap>
<sly data-sly-test="${n > 0}" data-sly-unwrap>
<sly data-sly-call="${step @ n = (n-1), src = src, aux = dst, dst = aux}" data-sly-unwrap/>
${src} -> ${dst}<br/>
<sly data-sly-call="${step @ n = (n-1), src = aux, aux = src, dst = dst}" data-sly-unwrap/>
</sly>
</sly>
<sly data-sly-call="${step @ n = 3, src = 'A', aux = 'B', dst = 'C'}" data-sly-unwrap/>
然而,它不能编译,因为Sightly不支持诸如-
的算术操作符。我不需要从3到0计数,我们可以反过来做,因为方向在这里并不重要。我只需要一个具有以下特征的计数器:
- 我们可以增加或减少它,
- 我们可以检查它是否等于零或某个固定数字。
我考虑使用字符串。空字符串将被视为零,“x”将是1,“xx”将是2,以此类推。我们可以检查字符串是否等于数字(n =='xxxx'
)。我们甚至可以通过Sightly 字符串格式化来递增它:
${'x{0}' @ format = [n]}
然而,上述表达式不能用作data-sly-call
或data-sly-test
的参数。我们只能立即显示它,无法进行进一步的处理。
如果有某些计数器可以使用,你还有其他想法吗?