第十二周知识总结

1.斐波那契数

long fib_recr(int n) {

if (n==0 || n==1) return 1;

else return fib_recr(n-2)+fib_recr(n-1);

}

int main(void) {

int n; // 输入的自然数 。

do {

printf("读入以一个自然数 n (n<0 则终止):");

scanf("%d", &n);

if (n>=0) {

printf("斐波那契数 fib_recr(%d): %ld\n", n, fib_recr(n));

}

}while(n>=0);

2阿克曼函数

static unsigned long long i;

int acKerman(int m, int n) {
i++;
if (m==0) return n+1;
else if (n==0) return acKerman(m-1, 1);
else return acKerman(m-1, acKerman(m, n-1));
}

int main(void) {
int m, n; // 输入的自然数 。
printf("读入两个阿克曼函数的参数 m 与 n (m>=0 和 n>=0):");
scanf("%d %d", &m, &n);
i = 0;
printf("阿克曼函数 ack(%d, %d)): %d\n", m, n, acKerman(m, n));
printf("递归次数: %llu 次\n", i);
return 0;
}

3.汉诺塔

void hanoi(int n, char sour, char aux, char dest) {
static int step = 1; // 静态变量,步骤计数。
if (n > 0) { // 如果 n 大于 0,还有圆盘要移动。
// 利用目标柱,将 n-1 个大小排序的圆盘从源柱移到辅助柱。
hanoi(n-1, sour, dest, aux);
// 将源柱最上面的圆盘,n, 从源柱移到目标柱。
printf("步骤%d:将圆盘 %d 从 '%c' 柱移到 '%c' 柱\n", step++, n, sour, dest);
// 利用源柱,将 n-1 个大小排序的圆盘从辅助柱移到目标柱。
hanoi(n-1, aux, sour, dest);
}
}

int main(void) {
int n; // 圆盘个数。

do { // 输入圆盘个数。
printf("输入圆盘个数 (介于 1 与 12 之间 (含)):");
scanf("%d",&n); // 输入一个整数。
} while (n<1 || n>12);

printf("\n");
// 执行汉渃塔函数,源柱、辅助柱、与目标柱分别以字符 'A', 'B', 'C' 表示
hanoi(n, 'A', 'B', 'C');
printf("\n汉渃塔结束!!!\n");

return 0;
}

posted @ 2020-05-24 13:16  CYRCYR  阅读(115)  评论(0编辑  收藏  举报