user-0 提问: vs2017 运行程序第三个函数 就会停止工作

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-2
content: #include <stdio.h> #include<stdlib.h>  #define LEN 100  void init(int a[],int n) {     for(int i=0;i<n;i++)     {         a[i] = 5*i+rand()%5;     } }  void print(int a[],int n) {     for(int i=0;i<n;i++)     {         printf("%4d ",a[i]);     }     printf("\n"); }  /********************1.线性查找法***********************/ //线性查找法 //返回值： 返回元素key在a中的位置，不存在返回-1 //参数：a为查找表的顺序存储结构，key为待查找元素 int LinearSerach(int a[],int n,int key) {     int i;     for(i=0;i<n;i++)     {         if(a[i] == key)             return i+1 ;     }     return -1;  }   /********************2.二分查找法***********************/ //二分查找法的迭代版本 //返回值： 返回元素key在a中的位置，不存在返回-1 //参数：a为查找表的顺序存储结构，key为待查找元素 int BinarySerach(int a[],int n,int key) {     int mid,left=0,right=LEN-1;     while(left <= right)     {         mid = (left + right) / 2;         if(a[mid]== key)             return mid;         else if(a[mid]<key)             left = mid + 1;         else             right = mid -1;         printf("\n查找区间为:%d-----%d\n",left,right);     }     return  -1;  }  //二分查找法的递归版本 //返回值： 返回元素key在a中的位置，不存在返回-1 //参数：a为查找表的顺序存储结构，key为待查找元素, //low为本次查找范围的下限，high为本次查找范围的上限 int BinarySerachrs(int a[],int key,int low,int high) {     int mid; #if  1     mid = (low + high) / 2;      if (low >= high)         return -1;     if (a[mid] == key)         return mid;     if (a[mid] < key)         return BinarySerachrs(a, key, mid + 1, high);     else         return BinarySerachrs(a, key, low, mid - 1); #else     low = 0;     //high = LEN-1;     while(low <= high)     {         mid = (low + high) / 2;         printf("mid = %d\n", mid);         if(a[mid] ==key)             return mid;         else if(a[mid] < key)             BinarySerachrs(a,key,mid+1,high);         else             BinarySerachrs(a,key,low,mid-1);         printf("\n查找区间为:%d-----%d\n",low,high);     }     return -1; #endif }  /*打印选项*/ void Print_Choice() {     printf("\n功能：\n");     printf("\t1.线性查找法\n");     printf("\t2.二分查找法（迭代）\n");     printf("\t3.二分查找法（递归）\n");     printf("\t4.退出\n");     return; }  int main() {     int key,k,low,high,ch=-1;     int a[LEN];     init(a,LEN);     print(a,LEN);     printf("\n\n请输入要查找的值：");     scanf("%d",&key);     while (1)     {         Print_Choice();         printf("请选择：");         scanf("%d",&ch);          switch(ch)         {             case 1:                 k = LinearSerach(a,LEN,key);                 if(k == -1)                     printf("查找失败");                 else                     printf("元素所在位置：%d",k);                 break;             case 2:                 k = BinarySerach(a,LEN, key);                 if(k == -1)                     printf("查找失败");                 else                     printf("元素所在位置：%d",k+1);                 break;             case 3:                 low = 0;                 high = LEN-1;                 k =  BinarySerachrs( a, key, low, high);                 if(k == -1)                     printf("查找失败");                 else                     //printf("元素所在位置：%d",k);                     printf("元素所在位置：%d",k + 1);                 break;             case 4:                 return 1;             default:                 printf("输入错误!请重新输入...");                 break;         }     } }  参考一下吧  递归和迭代的区别，建议查找一下资料，对比一下；  递归类似迭代，只是循环的内容不一样。迭代就是循环，而递归再用循环，那就是死循环了。

user: user-3
content: Low high没赋值