【问题标题】:How to implement Tower of Hanoi in AEM Sightly如何在 AEM Sightly 中实现河内塔
【发布时间】:2014-12-18 10:44:13
【问题描述】:

我正在尝试实现递归算法求解河内塔 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-calldata-sly-test。我们只能显示它 立即,并且没有进一步的处理可用。

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

【问题讨论】:

    标签: math recursion aem sightly


    【解决方案1】:

    使用空嵌套数组:[] 为 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/>
    

    这里有趣的是,整数的这种构造与set-theoretic definition of natural numbers 非常相似。看来数学毕竟在网络开发中很有用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      相关资源
      最近更新 更多