一、累加的递归
1.核心函数
// 累加函数采用最为简单的递归方法
int addTo(int paraN) {
int tempSum;
printf("进入累加(%d)\r\n", paraN);
if (paraN <= 0) {
printf(" return 0\r\n ");
return 0;
} else {
tempSum = addTo(paraN - 1) + paraN;
printf(" return %d\r\n ", tempSum);
return tempSum;
}
}
2.完整代码
#include <stdio.h>
// 累加函数采用最为简单的递归方法
int addTo(int paraN) {
int tempSum;
printf("进入累加(%d)\r\n", paraN);
if (paraN <= 0) {
printf(" return 0\r\n ");
return 0;
} else {
tempSum = addTo(paraN - 1) + paraN;
printf(" return %d\r\n ", tempSum);
return tempSum;
}
}
void addToTest() {
int n, sum;
scanf("%d",&n);
sum = addTo(n);
printf("\r\n0 加到 %d 得到 %d.\r\n", n, sum);
}
void main() {
int n;
printf("请输入要累加的数字:");
addToTest();
}
3.运行结果
二、汉诺塔问题
1.核心函数
// 打印移动步骤
void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) {
if (paraN <= 0) {
return;
} else {
hanoi(paraN - 1, paraSource, paraTransit, paraDestination);
printf("%c -> %c \r\n", paraSource, paraDestination);
hanoi(paraN - 1, paraTransit, paraDestination, paraSource);
}
}
// 计算移动总次数
int movehanoi(int paraN) {
int temp;
temp = paraN;
if(paraN == 1){
temp = 1;
}
else{
temp = 2*movehanoi(paraN-1)+1;
}
return temp;
}
2.完整代码
#include <stdio.h>
void hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) {
if (paraN <= 0) {
return;
} else {
hanoi(paraN - 1, paraSource, paraTransit, paraDestination);
printf("%c -> %c \r\n", paraSource, paraDestination);
hanoi(paraN - 1, paraTransit, paraDestination, paraSource);
}
}
int movehanoi(int paraN) {
int temp;
temp = paraN;
if(paraN == 1){
temp = 1;
}
else{
temp = 2*movehanoi(paraN-1)+1;
}
return temp;
}
void hanoiTest() {
int n;
scanf("%d",&n);
hanoi(n, 'A', 'B', 'C');
}
void main() {
int n,k;
printf("请输入放入盘子个数:");
scanf("%d",&n);
k = movehanoi(n);
hanoiTest();
printf("%d个盘子总共移动%d次",n,k);
}
3.运行结果
三、总结
1、两个问题都采用了递归的思想,且都为最简单的递归,系统会自动为递归程序建栈
2、写汉诺塔核心函数时记得加上判断条件,以防输入为非正数的情况
3、汉诺塔问题的总移动次数实质上是2^n-1次
4、累加递归的时间复杂度和空间复杂度均为O(n),而汉诺塔问题的时间复杂度为O (2^n),空间复杂度为O(n),汉诺塔问题通过一系列的压栈弹栈,重复利用同一片空间,其空间复杂度并不比累加递归大