Оз: Подсчет 0 в деревьях с неограниченным количеством поддеревьев

Я пишу код для упражнения для моего университета, и у меня есть проблема. Я новичок в Oz и просто не могу понять, почему этот код ничего не показывает, но принимается компилятором:

declare Tree W P T1 T2 T3 T4
fun {Count0 Tree}
   case Tree.subT of nil then
      if Tree.value==0 then
     1
      else
     0
      end
   [] H|T then
      if Tree.value==0 then 1+{Count0 T}
      else
     0+{Count0 T}
      end
   end
end
in
T1 = tree(value:0 subT:nil)
T2 = tree(value:0 subT:[T4])
T3 = tree(value:0 subT:nil)
T4 = tree(value:0 subT:nil)
T0 = tree(value:W subT:[T1 T2 T3])
{Browse {Count0 Tree}}

Код должен посчитать число '0' в значении дерева и всех его поддеревьев, которые есть в списке в tree.subT и в этих деревьях и так далее.

Буду очень признателен за любую помощь!

2 ответа

Сначала вы никогда не назначаете ни Tree, ни W, поэтому функция будет блокироваться в первом case заявление. Тогда рекурсивный вызов {Count0 T} свяжет аргумент функции Count0 в список, а не дерево, так как T остальная часть списка деревьев, содержащихся в subT поле.

Count0 Функция может принимать список в качестве аргумента. Таким образом, чтобы получить value поле и для рекурсивной итерации по поддеревьям эта функция должна быть немного более сложной. Вы можете использовать аккумулятор для подсчета полей value содержащий 0 например.

Я надеюсь, что это полезно.

      declare Tree T0 T1 T2 T3 T4 W=1
fun {Count0 Tree}
   case Tree.subT
   of nil then if Tree.value==0 then 1 else 0 end
   [] H|T then
      case T
      of nil then if Tree.value==0 then 1+{Count0 H} else {Count0 H} end
      else
         if Tree.value==0
         then 1+{Count0 H}+for I in T sum:S do {S {Count0 I}} end
         else {Count0 H}+for I in T sum:S do {S {Count0 I}} end
         end
      end
   end
end
in
T1 = tree(value:0 subT:nil)
T2 = tree(value:0 subT:[T4])
T3 = tree(value:0 subT:nil)
T4 = tree(value:0 subT:nil)
T0 = tree(value:W subT:[T1 T2 T3])
{Browse {Count0 T0}}
Другие вопросы по тегам