Оз: подсчет 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 и в этих деревьях и так далее.

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


person wiwo    schedule 26.11.2015    source источник


Ответы (1)


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

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

person demesmaekerf    schedule 26.11.2015