递归 段错误 习题

Posted xuwanwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归 段错误 习题相关的知识,希望对你有一定的参考价值。

段错误

  1. 递归里面算阶乘 f(10000000)没有输出,使用gdb 显示 SIGSEGV--段错误
  2. 编译后产生的可执行文件里面保存着什么?
    1. UNIX/Linux 用 ELF
    2. DOS下用COFF
    3. Windows用PE(COFF扩充而得)
  3. 段(segmentation)
    1. 二进制文件内的区域。
    2. 可用size程序得到可执行文件中的各个段的大小
    3. Text Segment--正文段--储存指令
    4. Data Segment--数据段--储存已初始化的变量
    5. BSS Segment--BSS段--未赋值的全局变量
    1. 栈不储存在可执行文件内,而是在运行时创建
    2. 调用栈所在的段成为Stack Segment
    3. 和其他段一样,不能越界访问,否则会stack overflow
    4. 调用栈保存函数的调用关系和局部变量
    5. 栈空间的大小
      1. linux 通过ulimit修改 ulimit -a显示当前栈的大小, ulimit -s 32768 把栈大小指定为32MB
      2. windows 用gcc指定执行文件的栈大小,-Wl,--stack=<byte count>
    6. 局部变量也是放在堆栈段中,栈溢出不一定是因为递归调用太多次,可能是局部变量太大。因此建议“把较大的数组放在main函数外。

竞赛题目

  1. 刽子手游戏
    1. 看输入字符和给定字符关系
    2. 使用全局变量可便于维护内容,可以免去过多的参数传递。
    3. 猜过的字母再猜一次算错:将猜过的字母从答案内“删去”(改成不可能满足为答案的条件的数据)
  2. 救济金发放
    1. 一圈官员,两个官员逆时,顺时针数k, m个数,停下,被选中的离开队伍(可能是同一个人)
    2. #include<stdio.h>
      #define maxn 25
      int n,k,m,a[maxn];
      //逆时针走t步,步长为d 返回新位置
      int go(int p,int d,int t)
      {
          while(t--)
          {
              do
              {    
                  //前面减去1??? 
                  p=(p+d+n-1)%n+1;        //注意这里经过的数字是步数加一! 因此会有最后的+1; 
              }
              while(a[p]==0);
          }
          return p;
       } 
       int main()
       {
           while(scanf("%d%d%d",&n,&k,&m))
           {
               for(int i=1;i<=n;i++) a[i]=i;
               int left=n;
               int p1=n,p2=1;
               while(left)
               {
                   p1=go(p1,1,k);
                  p2=go(p2,-1,m);
                  printf("%3d",p1);left--;
                  if(p2!=p1)
                  {
                      printf("%3d",p2);
                      left--;
                  }
                  a[p1]=a[p2]=0;
                  if(left)
                  printf(",");
               }
               printf("\n");
           }
           return 0;
       }
  3. 信息解码
    1. 01字符串,长度会逐渐增加,且不存在全1的串。 编写一个解码程序,输入一个编码头,则序列的每个串对应一个字符。再编码文本。每个小结前三个数字表示编码长度,每小节以全1结束,编码以000结束。

以上是关于递归 段错误 习题的主要内容,如果未能解决你的问题,请参考以下文章

具有递归的 Python C API - 段错误

WC2022 习题选做及总结

在“设置”片段中夸大类PreferenceScreen的错误

为啥无限递归会导致段错误

为啥 PHP 中的无限递归函数会导致段错误?

VS2015 代码片段整理