[算法设计与分析]3.1.2递归设计要点(汉诺塔+整数的分划)

#include
#include

using namespace std;

void Hanoi(int n, char A, char B, char C);//5.递归汉诺塔
int Divide(int n, int m, int len);//6.整数分划
void Output(int num[], int len);
int divide[100] = {0};

int main ()
{

	Hanoi(3, 'A', 'B', 'C');
	cout << Divide(5, 4, 0);

}

void Hanoi(int n, char a, char b, char c)
{
	if(n == 0)
	return;
	Hanoi(n - 1, a, c, b);
	printf("remove %d from %c to %c\n", n, a, b);
	Hanoi(n - 1, c, b, a);
}

int Divide(int n, int m, int len)
{
	if(n < 0 && m < 0)
	{
		printf("error");
		return 0;
	}
	else if(n == 1 && m > 1)
	{
		divide[len] = 1;
		Output(divide, len + 1);
		return 1;
	}
	else if(n >= 0 && m == 1)
	{
		if(n == 0)
		{
			Output(divide, len);
	    }
	    else
	    {
	    	divide[len] = 1;
			Divide(n - 1, m, len + 1);
		}
		return 1;
	}
	else if(n < m)
	{
		return Divide(n, n, len);
	}
	else if(n == m)
	{
		divide[len] = m;
		Output(divide, len + 1);
		return Divide(n, m - 1, len) + 1;
	}
	else
	{
		divide[len] = m;
		return Divide(n - m, m, len + 1) + Divide(n, m - 1, len);
	}
}

void Output(int num[], int len)
{
	for(int i = 0; i < len; i++)
	printf("%d  ", num[i]);
	cout << endl;
}

 

你可能感兴趣的:(算法设计与分析)