2014-12-18 5 views
14

Я пытаюсь реализовать алгоритм рекурсивного алгоритма Tower of Hanoi проблема в зрелищном. Я знаю, что этот подход может не иметь много очевидных практических приложений , я рассматриваю его как загадку. Я в конечном итоге с чем-то так:Как реализовать Башня Ханоя в AEM 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/> 

Однако он не компилируется как красивый не поддерживает арифметических операторов как -. Мне не нужно считать от 3 до 0, мы можем сделать это напротив, так как направление здесь не имеет значения. Мне просто нужно немного вид счетчика со следующими характеристиками:

  1. мы можем увеличивать или уменьшать его,
  2. мы можем проверить, равен нулю или какой-то постоянное число.

Я думал об использовании. Пустая строка будет равна нулю, «x» будет 1, «xx» будет 2 и так далее. Мы можем проверить, соответствует ли строка номеру (n == 'xxxx'). Можно даже увеличивать его, используя красивый string formatter:

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

Однако приведенное выше выражение не может быть использован в качестве параметра в data-sly-call или в data-sly-test. Мы можем отображать его только и дальнейшая обработка недоступна.

Есть ли у вас какие-либо другие идеи, если есть счетчик, который я могу использовать?

ответ

14

Используйте пустые вложенные массивы: [] является 0, [[]] является 1, [[[]]] 2 и т.д. Если n это число, то:

  • n[0] Декременты это (как мы получаем внутренний массив),
  • [n] приращений (как мы оберните n с новым массивом),
  • data-sly-test будет принимать все п> 0 (по крайней мере, два открывающих скобок).

Рабочий код для п = 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. Похоже, что Maths полезен в веб-разработке в конце концов!