Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Write a program to solve the Towers of Hanoi problem for a tower of size n, usin

ID: 3740803 • Letter: W

Question

Write a program to solve the Towers of Hanoi problem for a tower of size n, using both recursion and iteration. Time each method separately. Be very carefull to time only the actual work and avoid superfluous module calls and initialization, etc. Compare and contrast your two versions of the problem. Are they what you expected? Your analysis must contain a table of the times obtained for each run.

For a tower of a particular size, your output should consist of a list of moves that must be made as well as the times obtained. Disk 1 is always the top disk. Print your output to a file, not the screen. E.g. for a tower of size two Move disk 1 from tower A to tower C Move disk 2 from tower A to tower B Move disk 1 from tower C to tower B Run each version for the values n=1,2,3...50 or until you time out.

Explanation / Answer

############ Recursive ############

#include <stdio.h>

// C recursive function to solve tower of hanoi puzzle

void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod)

{

    if (n == 1)

    {

        printf(" Move disk 1 from rod %c to rod %c", from_rod, to_rod);

        return;

    }

    towerOfHanoi(n-1, from_rod, aux_rod, to_rod);

    printf(" Move disk %d from rod %c to rod %c", n, from_rod, to_rod);

    towerOfHanoi(n-1, aux_rod, to_rod, from_rod);

}

int main()

{

    int n = 4; // Number of disks

    towerOfHanoi(n, 'A', 'C', 'B'); // A, B and C are names of rods

    return 0;

}

############### Iterative ############

// C Program for Iterative Tower of Hanoi

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include <limits.h>

// A structure to represent a stack

struct Stack

{

   unsigned capacity;

   int top;

   int *array;

};

// function to create a stack of given capacity.

struct Stack* createStack(unsigned capacity)

{

    struct Stack* stack =

        (struct Stack*) malloc(sizeof(struct Stack));

    stack -> capacity = capacity;

    stack -> top = -1;

    stack -> array =

        (int*) malloc(stack -> capacity * sizeof(int));

    return stack;

}

// Stack is full when top is equal to the last index

int isFull(struct Stack* stack)

{

   return (stack->top == stack->capacity - 1);

}

// Stack is empty when top is equal to -1

int isEmpty(struct Stack* stack)

{

   return (stack->top == -1);

}

// Function to add an item to stack. It increases

// top by 1

void push(struct Stack *stack, int item)

{

    if (isFull(stack))

        return;

    stack -> array[++stack -> top] = item;

}

// Function to remove an item from stack. It

// decreases top by 1

int pop(struct Stack* stack)

{

    if (isEmpty(stack))

        return INT_MIN;

    return stack -> array[stack -> top--];

}

// Function to implement legal movement between

// two poles

void moveDisksBetweenTwoPoles(struct Stack *src,

            struct Stack *dest, char s, char d)

{

    int pole1TopDisk = pop(src);

    int pole2TopDisk = pop(dest);

    // When pole 1 is empty

    if (pole1TopDisk == INT_MIN)

    {

        push(src, pole2TopDisk);

        moveDisk(d, s, pole2TopDisk);

    }

    // When pole2 pole is empty

    else if (pole2TopDisk == INT_MIN)

    {

        push(dest, pole1TopDisk);

        moveDisk(s, d, pole1TopDisk);

    }

    // When top disk of pole1 > top disk of pole2

    else if (pole1TopDisk > pole2TopDisk)

    {

        push(src, pole1TopDisk);

        push(src, pole2TopDisk);

        moveDisk(d, s, pole2TopDisk);

    }

    // When top disk of pole1 < top disk of pole2

    else

    {

        push(dest, pole2TopDisk);

        push(dest, pole1TopDisk);

        moveDisk(s, d, pole1TopDisk);

    }

}

//Function to show the movement of disks

void moveDisk(char fromPeg, char toPeg, int disk)

{

    printf("Move the disk %d from '%c' to '%c' ",

           disk, fromPeg, toPeg);

}

//Function to implement TOH puzzle

void tohIterative(int num_of_disks, struct Stack

             *src, struct Stack *aux,

             struct Stack *dest)

{

    int i, total_num_of_moves;

    char s = 'S', d = 'D', a = 'A';

    //If number of disks is even, then interchange

    //destination pole and auxiliary pole

    if (num_of_disks % 2 == 0)

    {

        char temp = d;

        d = a;

        a = temp;

    }

    total_num_of_moves = pow(2, num_of_disks) - 1;

    //Larger disks will be pushed first

    for (i = num_of_disks; i >= 1; i--)

        push(src, i);

    for (i = 1; i <= total_num_of_moves; i++)

    {

        if (i % 3 == 1)

          moveDisksBetweenTwoPoles(src, dest, s, d);

        else if (i % 3 == 2)

          moveDisksBetweenTwoPoles(src, aux, s, a);

        else if (i % 3 == 0)

          moveDisksBetweenTwoPoles(aux, dest, a, d);

    }

}

// Driver Program

int main()

{

    // Input: number of disks

    unsigned num_of_disks = 3;

    struct Stack *src, *dest, *aux;

    // Create three stacks of size 'num_of_disks'

    // to hold the disks

    src = createStack(num_of_disks);

    aux = createStack(num_of_disks);

    dest = createStack(num_of_disks);

    tohIterative(num_of_disks, src, aux, dest);

    return 0;

}

YOu can change main method to run for particulat N value

#include <stdio.h>

// C recursive function to solve tower of hanoi puzzle

void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod)

{

    if (n == 1)

    {

        printf(" Move disk 1 from rod %c to rod %c", from_rod, to_rod);

        return;

    }

    towerOfHanoi(n-1, from_rod, aux_rod, to_rod);

    printf(" Move disk %d from rod %c to rod %c", n, from_rod, to_rod);

    towerOfHanoi(n-1, aux_rod, to_rod, from_rod);

}

int main()

{

    int n = 4; // Number of disks

    towerOfHanoi(n, 'A', 'C', 'B'); // A, B and C are names of rods

    return 0;

}

############### Iterative ############

// C Program for Iterative Tower of Hanoi

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include <limits.h>

// A structure to represent a stack

struct Stack

{

   unsigned capacity;

   int top;

   int *array;

};

// function to create a stack of given capacity.

struct Stack* createStack(unsigned capacity)

{

    struct Stack* stack =

        (struct Stack*) malloc(sizeof(struct Stack));

    stack -> capacity = capacity;

    stack -> top = -1;

    stack -> array =

        (int*) malloc(stack -> capacity * sizeof(int));

    return stack;

}

// Stack is full when top is equal to the last index

int isFull(struct Stack* stack)

{

   return (stack->top == stack->capacity - 1);

}

// Stack is empty when top is equal to -1

int isEmpty(struct Stack* stack)

{

   return (stack->top == -1);

}

// Function to add an item to stack. It increases

// top by 1

void push(struct Stack *stack, int item)

{

    if (isFull(stack))

        return;

    stack -> array[++stack -> top] = item;

}

// Function to remove an item from stack. It

// decreases top by 1

int pop(struct Stack* stack)

{

    if (isEmpty(stack))

        return INT_MIN;

    return stack -> array[stack -> top--];

}

// Function to implement legal movement between

// two poles

void moveDisksBetweenTwoPoles(struct Stack *src,

            struct Stack *dest, char s, char d)

{

    int pole1TopDisk = pop(src);

    int pole2TopDisk = pop(dest);

    // When pole 1 is empty

    if (pole1TopDisk == INT_MIN)

    {

        push(src, pole2TopDisk);

        moveDisk(d, s, pole2TopDisk);

    }

    // When pole2 pole is empty

    else if (pole2TopDisk == INT_MIN)

    {

        push(dest, pole1TopDisk);

        moveDisk(s, d, pole1TopDisk);

    }

    // When top disk of pole1 > top disk of pole2

    else if (pole1TopDisk > pole2TopDisk)

    {

        push(src, pole1TopDisk);

        push(src, pole2TopDisk);

        moveDisk(d, s, pole2TopDisk);

    }

    // When top disk of pole1 < top disk of pole2

    else

    {

        push(dest, pole2TopDisk);

        push(dest, pole1TopDisk);

        moveDisk(s, d, pole1TopDisk);

    }

}

//Function to show the movement of disks

void moveDisk(char fromPeg, char toPeg, int disk)

{

    printf("Move the disk %d from '%c' to '%c' ",

           disk, fromPeg, toPeg);

}

//Function to implement TOH puzzle

void tohIterative(int num_of_disks, struct Stack

             *src, struct Stack *aux,

             struct Stack *dest)

{

    int i, total_num_of_moves;

    char s = 'S', d = 'D', a = 'A';

    //If number of disks is even, then interchange

    //destination pole and auxiliary pole

    if (num_of_disks % 2 == 0)

    {

        char temp = d;

        d = a;

        a = temp;

    }

    total_num_of_moves = pow(2, num_of_disks) - 1;

    //Larger disks will be pushed first

    for (i = num_of_disks; i >= 1; i--)

        push(src, i);

    for (i = 1; i <= total_num_of_moves; i++)

    {

        if (i % 3 == 1)

          moveDisksBetweenTwoPoles(src, dest, s, d);

        else if (i % 3 == 2)

          moveDisksBetweenTwoPoles(src, aux, s, a);

        else if (i % 3 == 0)

          moveDisksBetweenTwoPoles(aux, dest, a, d);

    }

}

// Driver Program

int main()

{

    // Input: number of disks

    unsigned num_of_disks = 3;

    struct Stack *src, *dest, *aux;

    // Create three stacks of size 'num_of_disks'

    // to hold the disks

    src = createStack(num_of_disks);

    aux = createStack(num_of_disks);

    dest = createStack(num_of_disks);

    tohIterative(num_of_disks, src, aux, dest);

    return 0;

}

YOu can change main method to run for particulat N value

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote