折纸问题

5 篇文章 0 订阅
4 篇文章 0 订阅

折纸问题


  • 问题描述:
    这里写图片描述
    这里写图片描述

分析

这里写图片描述

  • 其实该问题就是一个中序遍历的问题:
  • 根节点是凹的
  • 左孩子总是凸折痕
  • 右孩子总是凹折痕
  • 递归出口,到了叶子节点,也就是折到了给出的最大折叠次数(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值