Recursive function going infinite and I can't see why.
Gregory Piñero
gregpinero at gmail.com
Sat Feb 4 02:29:29 EST 2006
By the way, all I'm trying to do here is take two trees, randomly find
a sub-tree of each and swap the sub-trees. So if anyone has a simple
method for doing that I'm certainly open to that too.
Thanks again,
-Greg
On 2/4/06, Gregory Piñero <gregpinero at gmail.com> wrote:
> Hi,
>
> Would anyone be able to tell me why my function below is getting stuck
> in infinite recusion?
> Maybe I'm just tired and missing something obvious?
>
> def replace_within_node(node,oldnode,newnode):
> if node is oldnode:
> return newnode
> else:
> for varname,value in node.__dict__.items():
> node.__dict__[varname]=replace_within_node(value,oldnode,newnode)
> return node
>
> At the end of this email I pasted the whole text of the sample code in
> case it would help to see it in context or maybe step through it?
>
> --
> Gregory Piñero
> Chief Innovation Officer
> Blended Technologies
> (www.blendedtechnologies.com)
>
>
> #This is the code that's causing my problem:
> #----------------------------------------------------------------------
>
> import random
> import sys
>
> class Test_Class:
> pass
> class Node:
> def __init__(self):
> self.arg0=0
> self.arg1=0
> self.arg2=0
> self.arg3=0
>
> def snip(node):
> prob_of_returning_this_node=.4
> if random.random()<=prob_of_returning_this_node:
> return node
> else:
> if hasattr(node,'__dict__') and len(node.__dict__)>0:
> return snip(random.choice(node.__dict__.values()))
> else:
> return node
>
> def replace_within_node(node,oldnode,newnode):
> if node is oldnode:
> return newnode
> else:
> if hasattr(node,'__dict__'):
> for varname,value in node.__dict__.items():
>
> node.__dict__[varname]=replace_within_node(value,oldnode,newnode)
> return node
>
> def generate_random_program(currdepth,mindepth=2,maxdepth=4):
> node=Node()
> if currdepth==maxdepth:
> return node
> else:
> node=Node()
> for varname,value in node.__dict__.items():
> node.__dict__[varname]=generate_random_program(currdepth+1,mindepth,maxdepth)
> return node
>
> def breed(father,mother):
> #want to take subtree from each input parameter and swap them.
> snip_from_mother=snip(mother.program)
> snip_from_father=snip(father.program)
> program_for_father=replace_within_node(father.program,snip_from_father,snip_from_mother)
> program_for_mother=replace_within_node(mother.program,snip_from_mother,snip_from_father)
> return program_for_father,program_for_mother
>
> if __name__=='__main__':
> dragons=[Test_Class() for i in range(10)]
> for dragon in dragons:
> dragon.program=generate_random_program(0)
> for i in range(100):
> breed(dragons[0],dragons[1])
>
--
Gregory Piñero
Chief Innovation Officer
Blended Technologies
(www.blendedtechnologies.com)
More information about the Python-list
mailing list