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

Tell us what’s happening:

I did what it is telling me. I took the first if statement and moved it into my new function, I also took out the first print call in the if statement. What am I missing here??

Your code so far

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

# User Editable Region

def make_allowed_move(rod1, rod2):
    if remainder == 1:
        forward = False
        if not rods[target]:
            forward = True
        elif rods[source] and rods[source][-1] < rods[target][-1]:
            forward = True
        if forward:
            print(f'Moving disk {rods[source][-1]} from {source} to {target}')
            rods[target].append(rods[source].pop())
        else:
            print(f'Moving disk {rods[target][-1]} from {target} to {source}')
            rods[source].append(rods[target].pop())

            # display our progress
        print(rods)

def move(n, source, auxiliary, target):
    # display starting configuration
    print(rods)
    for i in range(number_of_moves):
        remainder = (i + 1) % 3
        if remainder == 1:
            print(f'Move {i + 1} allowed between {source} and {target}')
            forward = False
            if not rods[target]:
                forward = True
            elif rods[source] and rods[source][-1] < rods[target][-1]:
                forward = True
            if forward:
                print(f'Moving disk {rods[source][-1]} from {source} to {target}')
                rods[target].append(rods[source].pop())
            else:
                print(f'Moving disk {rods[target][-1]} from {target} to {source}')
                rods[source].append(rods[target].pop())

            # display our progress
            print(rods)

# User Editable Region

        elif remainder == 2:
            print(f'Move {i + 1} allowed between {source} and {auxiliary}')
        elif remainder == 0:
            print(f'Move {i + 1} allowed between {auxiliary} and {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 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2.1 Safari/605.1.15

Challenge Information:

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

1 Like

This should not be there.

1 Like

If I look at the original lesson, it is asking you to take what is INSIDE the if statement to the new function (except the first print statement).
Your code shows the whole if statement moved.
That means, the variable ‘remainder’ does not have a value in your ‘make_allowed_move’ function.
Remember what you learned about scope of variables.

If it will not sort itself out, then perhaps you should reset this lesson (step 31) and start again.
This time, leave the actual line containing the if statement where it is, and move the lines below the if statement (up till the end of that if statement).

Remember the indentation - that is what defines the beginning and end of each segment (if / for / elif / else . . .).

If you are still unclear, ask specifically what you don’t understand . . . we will try our best to explain.
You can do this . . . you are so close!

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