我必须写一个谓词ListInTree(T,X),当T是一个在每个节点中都有一个列表的树时,这是真的,而X是所有列表的串联(假设在预订中访问)。 / p>
我真的无法理解如何使用递归来访问所有树。
由于
答案 0 :(得分:2)
你没有说明你所追求的是什么树,所以我必须猜测。在这种情况下,最好的是使用DCG,因为语法是以最自然的方式建立连接模型:
public function stage_EnterFrame(e:Event)
{
var num:Number = _microphone.activityLevel;
trace("in the stage_entrance");
trace(thisStage.getChildByName("micIndicator"));
trace("===========================");
thisActivity.play();
if (thisStage.getChildByName("micIndicator") == null) {
trace("no recorder movie clip");
thisStage.addChild(thisActivity);
}
trace(thisActivity.currentFrame);
thisActivity.gotoAndStop(uint((num/100)*29));
}
答案 1 :(得分:1)
为了举例,让我们假设树的以下表示形式:
nil
代表空树。tree/3
代表非空树tree( Left , Right , Payload )
,其中Left
和Right
代表(分别和递归)左右子树,Payload
}是节点的有效负载:在您的情况下,是一个列表。许多/大多数递归问题都有1或2个特殊情况"而更一般的情况。这没有什么不同:
特殊情况是空树:展平它会产生空列表。
一般情况是非空树:展平它包含以下步骤:
结果是通过串联获得的
实现此目的的Prolog代码与上面的英文描述完全相同:
flatten_tree( nil , [] ) . % flattening the empty tree yields an empty list, n'est-ce-pas?
flatten_tree( tree(Left,Right,Payload) , Result ) :- % flattening a non-empty tree consists of
flatten_tree( Left , Prefix ) , % - flattening the left subtree,
flatten_tree( Right , Suffix ) , % - flattening the right subtree,
concatenate( Prefix , Payload , Suffix , Result ) % - concatenating the three parts
. % - easy!
concat( Xs, Ys , Zs , Rs ) :-
append(Xs,Ys,T1) ,
append(T1,Zs,Rs)
.
有人可能会注意到另一种方法可能是使用findall/3
和append/2
(如果你正在使用SWI prolog)。
首先,你需要一个谓词来通过回溯来访问树:
visit( tree(L,_,_) , P ) :- visit( L , P ) . % visit the left subtree
visit( tree(_,_,P) , P ) . % visit the current node
visit( tree(_,R,_) , P ) :- visit( R , P ) . % visit the right subtree
随意重新排列条款的顺序,以获得您喜欢的订单。一旦你有了这个,压扁树是微不足道的:
flatten_tree( Tree , List ) :-
findall( X, visit(Tree,X) , Xs ) ,
append(Xs,List)
.