简体   繁体   中英

Using loops to call recursive function

I am trying to create a recursive function that takes three parameters: name of the dictionary, name of the original (This will be the key in the dict), and name of the final (trying to determine if it is possible to reach the final from the original)

My code functions well and enters the correct if statements and everything (tested using print statements) however, instead of the function returning True or False, it returns None every time.

I determined that this is because rather than calling my recursive function with "return" I only call the name of the function. However, if I include return in my code, the function only runs with the first value from the dictionary's key.

Any and all help on this would be appreciated.

def evolve(dictname, babyname, evolvedname):
    if babyname == evolvedname:
        return True
    elif babyname in dictname.keys():
        if dictname[babyname]:
            for i in dictname[babyname]:
                evolve(dictname,i,evolvedname)
        else:
            return False
    else:
        return False

Collect all recursive call's results, and return True if any of them is true.

Something like:

def evolve(dictname, babyname, evolvedname):
    if babyname == evolvedname:
        return True
    elif babyname in dictname.keys():
        if dictname[babyname]:
            results = [] #To collect results
            for i in dictname[babyname]:
                results.append(evolve(dictname,i,evolvedname))
            #Check if any of them is True
            for res in results:
                if res==True: return True
            return False #No true among childs
        else:
            return False
    else:
        return False

But I think this code can be simplified to just:

def evolve(dictname, babyname, evolvedname):
    if babyname == evolvedname:
        return True
    return any(evolve(dictname,i,evolvedname) for i in dictname.get(babyname,[]))

Lastly, although I don't know what you are trying to do, you might get an infinite loop, this is like doing dfs but without marking any node as already explored(black) or currently exploring(gray).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM