14

我正在尝试在 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,我们可以反其道而行之,因为这里的方向并不重要。我只需要某种具有以下功能的计数器:

  1. 我们可以增加或减少它,
  2. 我们可以检查是否等于零或某个常数。

我考虑过使用字符串。空字符串为零,“x”为 1,“xx”为 2,依此类推。我们可以检查一个字符串是否等于一个数字 ( n == 'xxxx')。我们甚至可以使用 Sightly string formatter来增加它:

${'x{0}' @ format = [n]}

但是,上述表达式不能用作 data-sly-call或 中的参数data-sly-test。我们只能立即显示,无法进行进一步处理。

如果有一些我可以使用的计数器,您还有其他想法吗?

4

1 回答 1

14

使用空嵌套数组:[]为 0、[[]]为 1、[[[]]]为 2 等。如果n是数字,则:

  • n[0]递减它(当我们得到内部数组时),
  • [n]n递增它(当我们用新数组包装时),
  • data-sly-test将接受所有 n > 0 (至少两个左括号)。

n=3 的工作代码如下所示:

<sly data-sly-template.step="${@ n, src, aux, dst}" data-sly-unwrap>
  <sly data-sly-test="${n}" data-sly-unwrap>
    <sly data-sly-call="${step @ n = n[0], src = src, aux = dst, dst = aux}" data-sly-unwrap/>
    ${src} -> ${dst}<br/>
    <sly data-sly-call="${step @ n = n[0], src = aux, aux = src, dst = dst}" data-sly-unwrap/>
  </sly>
</sly>

<sly data-sly-call="${step @ n = [[[[]]]], src = 'A', aux = 'B', dst = 'C'}" data-sly-unwrap/>

这里有趣的是,整数的这种构造与自然数的集合论定义非常相似。看来数学毕竟在网络开发中很有用!

于 2014-12-18T10:44:13.943 回答