如何在AEM中实施河内塔

Tom*_*wek 14 math recursion aem sightly

我正试图在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/>
Run Code Online (Sandbox Code Playgroud)

但是,它没有编译,因为Sightly不支持算术运算符-.我不需要从3到0计数,我们可能会采用相反的方式,因为这里的方向并不重要.我只需要一些具有以下功能的计数器:

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

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

${'x{0}' @ format = [n]}
Run Code Online (Sandbox Code Playgroud)

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

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

Tom*_*wek 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/>
Run Code Online (Sandbox Code Playgroud)

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