/* Write C programs that use both recursive and non-recursive functions
   To solve Towers of Hanoi problem.*/
#include<conio.h>
#include<stdio.h>
/* Non-Recursive Function*/
void hanoiNonRecursion(int num,char sndl,char indl,char dndl)
{
  char stkn[50],stksndl[50],stkindl[50],stkdndl[50],stkadd[50],temp;
  int top,add;
  top=NULL;
  one:
	if(num==1)
	{
	  printf("\nMove top disk from needle %c to needle %c ",sndl,dndl);
	  goto four;
	}
  two:
	top=top+1;
	stkn[top]=num;
	stksndl[top]=sndl;
	stkindl[top]=indl;
	stkdndl[top]=dndl;
	stkadd[top]=3;
	num=num-1;
	sndl=sndl;
	temp=indl;
	indl=dndl;
	dndl=temp;
	goto one;
  three:
	printf("\nMove top disk from needle %c to needle %c ",sndl,dndl);
	top=top+1;
	stkn[top]=num;
	stksndl[top]=sndl;
	stkindl[top]=indl;
	stkdndl[top]=dndl;
	stkadd[top]=5;
	num=num-1;
	temp=sndl;
	sndl=indl;
	indl=temp;
	dndl=dndl;
	goto one;
  four:
	if(top==NULL)
	  return;
	num=stkn[top];
	sndl=stksndl[top];
	indl=stkindl[top];
	dndl=stkdndl[top];
	add=stkadd[top];
	top=top-1;
	if(add==3)
	  goto three;
	else if(add==5)
	  goto four;
}
/* Recursive Function*/
void  hanoiRecursion( int num,char ndl1, char ndl2, char ndl3)
{
    if ( num == 1 ) {
	printf( "\nMove top disk from needle %c to needle %c.", ndl1, ndl2 );
	return;
     }
     hanoiRecursion( num - 1,ndl1, ndl3, ndl2 );
     printf( "\nMove top disk from needle %c to needle %c.", ndl1, ndl2 );
     hanoiRecursion( num - 1,ndl3, ndl2, ndl1 );
}
int main()
{
  int no;
  printf("Enter the no. of disks to be transferred: ");
  scanf("%d",&no);
  if(no<1)
     printf("\nThere's nothing to move.");
  else
     printf("Non-Recursive");
     hanoiNonRecursion(no,'A','B','C');
     printf("\nRecursive");
     hanoiRecursion(no,'A','B','C');
  return 0;
}

 OUTPUT:

Enter the no. of disks to be transferred: 3
Non-Recursive
Move top disk from needle A to needle C
Move top disk from needle A to needle B
Move top disk from needle C to needle B
Move top disk from needle A to needle C
Move top disk from needle B to needle A
Move top disk from needle B to needle C
Move top disk from needle A to needle C
Recursive
Move top disk from needle A to needle B.
Move top disk from needle A to needle C.
Move top disk from needle B to needle C.
Move top disk from needle A to needle B.
Move top disk from needle C to needle A.
Move top disk from needle C to needle B.
Move top disk from needle A to needle B.

Reference:C Programming and Data Structures by E.Balagurusamy. TMH Publishers.