如何在AEM Sightly中实现汉诺塔问题

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 字符串格式化来递增它:

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

然而,上述表达式不能用作data-sly-calldata-sly-test的参数。我们只能立即显示它,无法进行进一步的处理。

如果有某些计数器可以使用,你还有其他想法吗?

1个回答

14

使用空的嵌套数组:[] 代表 0,[[]] 代表 1,[[[]]] 代表 2,以此类推。

  • n[0] 减 1(因为我们得到内部的数组),
  • [n] 加 1(因为我们用一个新数组包装了 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/>

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接