Oz:在树中使用无限子树计数0

时间:2015-11-26 20:52:57

标签: recursion tree subtree oz mozart

我正在为我的大学写一个练习代码并遇到问题。我对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和这些树中列表中的所有子树等等。

我将非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

首先,您永远不会将树分配给W,因此该函数将在第一个case语句中阻止。 然后递归调用{Count0 T}将函数Count0的参数绑定到列表而不是树,因为TsubT中包含的树列表的其余部分字段。

Count0函数可以将列表作为参数。因此,要获得value字段并在子树上递归迭代,此函数应该更复杂一些。您可以使用累加器来计算包含0的字段value的计数。