Оз: Подсчет 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}}