关于递归

  递归满足2个条件:

    1)有反复执行的过程(调用自身)

    2)有跳出反复执行过程的条件(递归出口)


从3个简单的小问题看递归
问题1:
利用递归实现:逆向打印字符串

void strRev(char a[],int start)
{
     if(a[start]!='\0')
     {
          strRev(a,start+1);
          printf("%c",a[start]);
     }
}

分析代码
因为需求是逆向打印,而我们通过传进的参数只能知道开始位置的字符, 所以我们可以调用自己遍历到得到最后的字符,(当然根据字符串的特点,\0是结束标记)这就是 很容易看出设置的条件是终止递,然后的过程逆向回归的,(因为是栈实现的),从而实现这个逆向打印。

接着分析流程 
1.判断退出条件 2.递:重复递start+1这个参数,所有的调用自身全部停到某处,下一位置就是业务函数
 3.直到判断结束4.归:执行主业务代码printf()

问题2:
打印数组(递归):

void  printarray  ( char  a [], int  start  ,  int  end  )
{
                  if ( start  < end )
                {
                                  printf  ( "%d"  ,  a [  start  ]);
                                  printarray ( a  , start +1 ,  end );
                          
                                
                }
}
分析:
1从对于数组的操作,必须知道数组中元素的个数,为了方便用了下标表示
2.递归必须需要可遍历的参数

这个和上面的差不多,我们只需要
1.思考出递 终止条件
2.调整先递归 还是先执行 业务代码


问题3.找出数组中最小值

这个问题应该才算真正的递归思想

分析:
1.需要找到n个元素的最小值,我们可以先找到n-1个元素的最小值和第n个元素对比,就得到了最小值

int find_min(int a[],int start, int end)
{
     if (start <end-1)
     {
          int min =a[start];
          int temp = find_min(a,start+1,end);
          min = min<temp?min:temp;
     }
}

1.结束递条件
2.得到首元素的值,和剩下元素的最小值对比(和上面的思路反一下,其实一样的)

最后看一下 选择排序:
void selectionSort(int *data,int start,int end) 

     if (start<end)
     {
          int min_index =start;
          int i;
          int temp;
          for( i = start; i< end ;i++)
          {
               if (data[i]<data[min_index])
               {
                    min_index = i;
               }
          }
          //第一个位置和最小值交换
          temp = data[min_index];
          data[min_index] = data[start];
          data[start] = temp;
          //重复这个过程,第一个位置+1
          selectionSort(data, start+1, end); 
     }

}  

你可能感兴趣的:(C语言)