折纸问题
- 问题描述:
![]()
分析
- 其实该问题就是一个中序遍历的问题:
- 根节点是凹的
- 左孩子总是凸折痕
- 右孩子总是凹折痕
- 递归出口,到了叶子节点,也就是折到了给出的最大折叠次数(level==maxlevel)
代码
#include <stdio.h>
using namespace std;
char * left = "left"; //定义两个常量,分别表示左和右
char * right = "right";
void print(char * flag){ //辅助函数print,接受一个参数flag,flag为left或者为right,为left时打印凸,为right时打印凹;
if (flag==left) {
printf("凸\n");
}
else{
printf("凹\n");
}
}
void foldpaper(int level, char * flag, int maxLevel){ //根据中序遍历模版,写一个遍历算法
/*该函数接受三个参数:
level :表示当前对折的是第几次
flag :表示左或者右
maxLevel :表示一共要折多少次
*/
if (level==maxLevel) { //递归出口是当当前是最大一次折叠时,也就是为叶子节点时
print(flag);
}else{
foldpaper(level+1, left, maxLevel); //对于左子树为left,也就是为凸
print(flag);
foldpaper(level+1, right, maxLevel); //对于右子树为right,也就是为凹
}
}
int main() {
foldpaper(1, right, 3);
return 0;
}
注意这种做法:对于左子树和右子树分别有不同的表现时(如:左凸右凹)。中序遍历模版中,递归函数需要加上一个参数(如flag)来区分左还是右。如遍历左子树时,传入参数left;遍历右子树时传入参数right