您的位置:首页 > 其它

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

2018-03-31 14:52 856 查看
#include<stdio.h>
#include<iostream>

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(4, 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 + 1);
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息