简体   繁体   中英

Nothing is output in python recursive function

  • List item

I'm working on a code that calculates the 'distance' between two configurations of a Flip Cube, The distance between two configurations x and y is the minimum number of steps required to go from x to y, or conversely.

To make that I've created a simpler version that makes something different, this code takes two integer numbers ci and cf . with ci returns an iterable called main_level through the generator called multi , then, it iterates through it searching for the parameter cf , whenever cf is not in main_level the variable steps is increased by 1 and for each element in main_level we repeat the same process done for ci . Finally, when cii==cf the program ends and returns the steps variable, which counts the number of "levels" that we have to go down to find the given parameter cf . This code doesn't have any practical purpose is just a base for the problem I mentioned above.

If I call the distance(ci, cf) function with ci=5, the first two levels are:

{0,3,6,9,12} <-- first level (steps is initialized with 1) if cf is any of the numbers in the set, the program should end and return steps= 1 , if cf is not in that set, the programs form the second level: {15,18,21,24,27,30,33} and search cf , if cf is there, the program ends and should return steps= 2 , if not, it forms the third level, and so on. But there is a problem, actually, when I call the distance function with ci =5 and cf = any natural number, and print its value, anything is output, only for cf =0, it outputs step= 1 . I don't really know what's going on. I would appreciate your help.

Here is the code:

#Base solution to FlipCube problem

def multi(par):
   for i in range(par):
     yield i*3    

steps=1 

def distance(ci,cf):
    main_level =set(multi(ci))
    global steps  

    def check_main_level(cf):
        global  steps 
        nonlocal  main_level
        
        def lower_level(config_list):
            sett=set()
            for i in config_list:
               sett.update(q for q in multi(i) if q not in config_list)
            nonlocal  main_level
            main_level=sett
            check_main_level(cf)  

        for i in main_level:
            if i==cf:
                break
            else:
                steps+=1
                lower_level(main_level)
    check_main_level(cf)              
    return steps  
    
#testing
e=  distance(5,0)
print(e)# prints 1, very good
e2=  distance(5,9)
print(e2)# should print  1, but doesn't print anything :(
e3=  distance(5,27)
print(e3)# should print  2, but doesn't print anything :(

The program does not terminate recursion under all circumstances. The culprit seems to be the for loop in check_main_level . Change the code after your definition of lower_level to:

# code portion of check_main_level
        if cf > max(main_level):
            steps+=1
            lower_level(main_level)
# end of code portion check_main_level (replacing for-loop)

you have an infinity loop, that's why nothing is printed.

You can see it easyly by adding a print:

for i in config_list:
               print(i)
               sett=set()
               sett.update(q for q in list(multi(i)) if q not in config_list)

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