R E C U R S I O N

总的来说这是一种解决问题的观念,基本会经历以下几个阶段

以循环调用语句,在程序里面出现的地方作为断点,将程序分成上下两个阶段


      1.从程序开头的地方到断点,不断的执行上半部分

问题: 由static的性质,如果这个函数要被执行好几次,static就算退出了函数也不会被清零,这次留下来的值还会遗留到下一次

  • 此外在前半部分中的函数头里面,定义sta与定义常规的有什么区别?
  • 解答:区别是定义常规的划,每一轮都会重新定义一遍,导致这个变量被清零,信息丢失
    但是定义sta就不会再定义一遍,数据仍然保留着在。
    但是无论你定义sta或者是定义常规的变量都不会报错

    本来以为这个问题不用单独说,但是实际使用中这个问题比想象中使用的更加频繁,迭代中的信息传递
      这个信息可以是 1.迭代的次数count
                   2.测试信息通过(1)/不通过(0)

    你要做的是:先尽可能方便的获得信息,然后再利用漱口方法传递信息
  • 问题1:int属于临时定义变量,这也意味着我们一旦退出内嵌函数,自动丢失信息
    解决1.:定义Static变量,这个变量可以贯穿所有内嵌函数,退出内嵌函数也可以保留信息

  • 问题2:Static变量属于一次定义,贯穿main函数,因此就算下次再次调用这个函数,上次遗留下来static数据依旧还在
    解决2: 漱口办法收集,有一个sta变量来收集迭代时候我们想要的信息 - 漱口的行为分为测试信息传递 以及 计数型信息传递

测试型信息传递

拥有明显的通过/失败对应的标帜,并且标帜一旦发生就立刻开始退出嵌套,大多是返回值为0/1,明显是测试型函数的时候会刻意设置一个flag来记录测试通过/失败

- 解决方法:防止上一次的信息影响到本次,在标帜之前写清flag是等于0还是1
if (*ptr ==NULL){ flag=1;return 0;}                         标帜通过的事件发生,刷新flag
--
if (i==strlen(array)) {flag=0;return 0; }                   标帜失败的事件发生,刷新flag    

统计型信息传递

统计型信息通过每次嵌套,统计目标事件次数,可能也有失败信息,最后将这些信息作为返回值传递出去,相比较与测试型信息,最大的区别就是没有正确的说法,我们要的只是一个数据。
ANS//解决方法,静态数据的归零只能在退出嵌套的过程中完成,首先尽可能方便的收集信息,最后再考虑通过一个辅助静态数据将记录好的数据传输出去。

 辅助静态数据,在最后一次统计行为中,先清零漱口,再将统计数据转移到辅助中,负责统计的静态数据在退出嵌套的过程中清零
if (*ptr2 == NULL) { count =-1;b=0;b=count;return 0;}   标帜失败的事件发生,b清零+负责接受使失败信息
--
if (is_prefix(ptr1,ptr2)==true&&ptr2!=NULL)  {b=0;b=count;return 0;} 测试通过,b清零+负责传递统计信息
--
count=0; return b;                                             在退出嵌套的过程中将统计静态变量清零


内嵌过程终止,任何过程都不会无限制进行,那,什么情况下,什么时候我们认为是最后一次内嵌?       
  • 报错问题11 :在递归中就是由于无限制的调用内嵌函导致的,查看内嵌函数调用的实参有没有写错
  • 什么时候是最后一次内嵌? 可以是条件终于满足的时候&文本内容已到末尾

    案例: 指针+递归 指针为空的时候终止递归过程: *ptr == NULL return 0;
    此外在* ptr==NULL的时候 下面if ==true or false也是有可能对的上的,因此 if 的时候加上&& ptr!= NULL



if条件的顺序摆放问题

最后一个问题比较但疼,假设: 条件false ->执行下一次….. ->条件true,开始返回上一次,从断点处开始往后执行,-> 执行到最后一步- > 再返回上一次…….

这部分就是我们刚刚说的下半部分内容会被执行n次数,这里面会发生什么故事就很难说了,按理说我们执行到最后一次调用,任务应该已经结束了,数据也有sta int传完了,如果你确定任务都完成了,为了避免夜长梦多,应该尽量使下半部分不要去执行什么任务,有需要做的交给上半部分就可以了, 因此你需要 -> 将if==false中的断点放在if判断的最后面,就是越后面越好,这样断点下半部分就没什么内容做了,避免再执行些什么



用别的条件替代频繁的嵌套

很显然 这种操作可以用while来完成而不需要通过迭代做到,推荐是不停地用while过滤杂质,完全干净了再嵌套下一层,可以减少嵌套的 次数,使得过程更加清爽,只有在进程真正得到进步的时候再使用嵌套,其他时候使用while过滤杂质

    while (*ptr!= NULL && isalpha(*ptr)==0)
        ptr++;                                   是标点等杂质的情况下直接跳到下一字符位
   --
   if (*ptr ==NULL){flag=1;return 0;}    经常加一个判断,判断是否已经到了字段尾部,这个判断同时也可以嵌套使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值