0

ツリーを反復処理し、ランダムなインスタンスを見つけて、それを変更して終了しようとしていますが、再帰に問題があります。

突然変異後のループのエスケープに関する注意例外を発生させようとしましたが、子の反復を終了し、親を反復し続けます。

import random as random
rnd=random.random

class Found(Exception): pass

def displayRandomNode(self,indent=0,probchange=0.1):
    try:
        if rnd()<probchange:
            raise Found
        elif hasattr(self,"children"):
            for c in self.children:
                displayRandomNode(c,indent+1,probchange)
    except Found:
        if type(self)==float: pass
        else:
            print (' '*indent),self

注: 私が反復しているクラスは次のようになります (fw クラスは、子内のインスタンスのみを直接変更するわけではありません)。クラス ノードには、リスト内の 3 つのクラスすべての子が含まれる場合があります。

class node:
    def __init__(self,fw,children):
        self.function=fw.function
        self.name=fw.name
        self.children=children

class paramnode:
    def __init__(self,idx):
        self.idx=idx

class constnode:
    def __init__(self,v):
        self.v=v
4

1 に答える 1

1

通常のフローで例外処理を使用することは避け、エラー処理のために保持する必要があります。

ここに可能性があります:

def displayRandomNode(self,indent=0,probchange=0.1):
   if not hasattr(self,"children") or rnd() < probchange:
       return (self, indent)
   else:
       c = random.choice(self.children)
       return displayRandomNode(c,indent+1,probchange)

これは、各ノードで終了する可能性がほとんどないツリー全体を通過するというコードのアイデアに似た別の例です。何も見つからずに終了する可能性があることに注意してください。

def displayRandomNode(self,indent=0,probchange=0.1):
   if rnd() < probchange:
       return (self, indent)
   elif hasattr(self,"children"):
       res = None
       for c in self.children:
           res = displayRandomNode(c,indent+1,probchange)
           if res:
               break
       return res
于 2013-09-13T13:11:03.717 に答える