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计数,我们可能会采用相反的方式,因为这里的方向并不重要.我只需要一些具有以下功能的计数器:
我想过用字符串.空字符串为零,'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)
这里有趣的是,这种整数构造与自然数的集合论定义非常相似.看来数学毕竟在网络开发中很有用!