Learn Recursion by Solving the Tower of Hanoi Puzzle - Step 40

Tell us what’s happening:

What is says when I fail:
You should nest your print() and make_allowed_move() calls inside an if statement to execute when n is odd.

It looks nested to me. Not sure what else they are looking for.

Your code so far

NUMBER_OF_DISKS = 4
number_of_moves = 2**NUMBER_OF_DISKS - 1
rods = {
    'A': list(range(NUMBER_OF_DISKS, 0, -1)),
    'B': [],
    'C': []
}

def make_allowed_move(rod1, rod2):    
    forward = False
    if not rods[rod2]:
        forward = True
    elif rods[rod1] and rods[rod1][-1] < rods[rod2][-1]:
        forward = True
                      
    if forward:
        print(f'Moving disk {rods[rod1][-1]} from {rod1} to {rod2}')
        rods[rod2].append(rods[rod1].pop())
    else:
        print(f'Moving disk {rods[rod2][-1]} from {rod2} to {rod1}')
        rods[rod1].append(rods[rod2].pop())
    
    # display our progress
    print(rods, '\n')

def move(n, source, auxiliary, target):
    # display starting configuration
    print(rods, '\n')
    for i in range(number_of_moves):
        remainder = (i + 1) % 3
        if remainder == 1:
            if n % 2 != 0:
                print(f'Move {i + 1} allowed between {source} and {target}')
                make_allowed_move(source, target)

# User Editable Region

            else:
                print(f'Move {i + 1} allowed between {source} and {auxiliary}')
                # make_allowed_move(source, auxiliary)            
            if n % 2 == 1:
                print(f'Move {i + 1} allowed between {source} and {target}')
                make_allowed_move(source, target)
        elif remainder == 2:
            print(f'Move {i + 1} allowed between {source} and {auxiliary}')
            make_allowed_move(source, auxiliary)

# User Editable Region

        elif remainder == 0:
            print(f'Move {i + 1} allowed between {auxiliary} and {target}')
            make_allowed_move(auxiliary, target)
           
# initiate call from source A to target C with auxiliary B
move(NUMBER_OF_DISKS, 'A', 'B', 'C')

Your browser information:

User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36

Challenge Information:

Learn Recursion by Solving the Tower of Hanoi Puzzle - Step 40

Now you need to do the same with your elif statement:

Do the same as you did with your if remainder == 1: statement

your elif is here, and you have not added the conditional to execute the code in here only if n is odd

so this:

 if n % 2 == 1:
                print(f'Move {i + 1} allowed between {source} and {target}')
                make_allowed_move(source, target)

should be within the elif statement?

This is a bit misleading as the question that is asked of me is: “Now you need to do the same with your elif statement: put the print() and make_allowed_move() calls inside an if statement to execute when n is odd.”

To me, I should be creating another if statement to execute when ‘n’ is odd, but I have no idea where I am supposed to put that if statement for the code to run. The step could be a bit clearer.

What you did with this if statement:

Do the same thing with the elif statement. Enclose the body of the elif with a new if statement

I’m not understanding where I am supposed to put that statement. How can it go in the beginning of an if statement? I don’t understand how they can stack this way.

          else:
                print(f'Move {i + 1} allowed between {source} and {auxiliary}')
                # make_allowed_move(source, auxiliary)            

        elif remainder == 2:
            if n % 2 == 1:
                print(f'Move {i + 1} allowed between {source} and {target}')
                make_allowed_move(source, target)
            print(f'Move {i + 1} allowed between {source} and {auxiliary}')
            make_allowed_move(source, auxiliary)
type or paste code here

This looks better :+1:, but why are you repeating this block of code?

You also need to follow this instruction:

Also, turn the # make_allowed_move(source, auxiliary) comment into code.

So be careful!
It says that uncomment the line from the previous else:

I’ve done so. I know have

            else:
                print(f'Move {i + 1} allowed between {source} and {auxiliary}')
                 make_allowed_move(source, auxiliary)            

        elif remainder == 2:
            if n % 2 == 1:
                print(f'Move {i + 1} allowed between {source} and {target}')
                make_allowed_move(source, target)
            

I am getting the error of: Your code has an indentation error. You may need to add pass on a new line to form a valid block of code.

But I do not see an indentation error?

Screenshot 2024-04-11 093427

I think that you’ll also need to reset this step and try again, some other code has changed.

When I reset the lesson that is the indentation it starts me with… I am having a string of bad luck figuring out this website lately…

image

You need to delete the hash and the space to line up make with print

Screenshot 2024-04-12 122238

Screenshot 2024-04-11 093427

I wish that was the case…

            else:
                print(f'Move {i + 1} allowed between {source} and {auxiliary}')
                make_allowed_move(source, auxiliary)            

        elif remainder == 2:
            print(f'Move {i + 1} allowed between {source} and {auxiliary}')
            make_allowed_move(source, auxiliary)

inside an if statement to execute when n is odd.

Where is this if statement?

put the print() and make_allowed_move() calls inside an if statement to execute when n is odd.

You haven’t done this

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.