学习教材:计算机算法设计与分析(王晓东) 第四版
学习章节:2.1递归
学习内容:
1、排列问题
求出集合X中第m到第n个连续元素的全排列。
代码实现:
#include <stdio.h>
void Swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void Perm(int *arr, int s, int e)
{
int i = 0;
if (s == e)
{
for (i = 0; i <= e; i++)
printf("%d\t", arr[i]);
printf("\n");
}
else
for (i = s; i <= e; i++)
{
Swap(arr+s, arr+i);
Perm(arr, s+1, e);
Swap(arr+s, arr+i);
}
}
int main()
{
int a[4] = {0, 1, 2, 3};
Perm(a, 0, 3);
return 0;
}
2、整数划分问题
求出正整数n的所有不同划分中最大加数不大于m的划分的个数。
代码实现:
#include <stdio.h>
int count(int n, int m)
{
if (n < 1 || m < 1)
return 0;
if (n == 1 || m == 1)
return 1;
if (n < m)
return count(n, n);
if (n == m)
return count(n, m-1) + 1;
return count(n, m-1) + count(n-m, m);
}
int main()
{
printf("6的所有不同划分中最大加数不大于3的划分个数为:%d.\n", count(6, 3));
return 0;
}
3、汉诺塔问题。
将3根柱子上的第一根上n层下大上小的空心圆盘保持下大上小的规则借助第三根空柱子全部移到第二根空柱子上。
代码实现:
#include <stdio.h>
void hanoi(int n, char ch1, char ch2, char ch3)
{
if (n > 0)
{
hanoi(n-1, ch1, ch3, ch2);
printf("%c -> %c\n", ch1, ch2);
hanoi(n-1, ch3, ch2, ch1);
}
}
int main()
{
hanoi(3, 'a', 'b', 'c');
return 0;
}
输出: