zoukankan      html  css  js  c++  java
  • 今日新知(关于递归中变量的声明)

    在递归函数中用到的变量,要将它声明为局部变量,切记不能声明为全局变量。

    如下面归并排序中的变量k。

     1 #include<iostream>
     2 
     3 using namespace std;
     4 
     5 const int N = 100010;
     6 
     7 int a[N],b[N];
     8 
     9 int n ;
    10 long long res = 0 ; 
    11 
    12 void merge_sort(int a[],int l,int r){
    13     
    14     if(l >= r) return ;
    15     
    16     int mid = l + r >> 1;
    17     
    18     int k = 0;
    19     
    20     int i = l , j = mid + 1;
    21     merge_sort(a,l,mid);
    22     merge_sort(a,mid+1,r);
    23     while(i <= mid && j <= r){
    24         if(a[i] <= a[j]) b[k ++] = a[i ++];
    25         else {
    26             b[k ++] = a[j ++];
    27             res += mid - i + 1;
    28         }
    29     }
    30     while(i <= mid) b[k ++] = a[i ++];
    31     while(j <= r) b[k ++] = a[j ++];
    32     
    33     for(int i = l , j  = 0 ;  i <= r ; i ++ , j ++) a[i] = b[j];
    34 }
    35 
    36 int main(){
    37     cin >> n;
    38     for(int i = 0 ; i < n ; i ++) scanf("%d",&a[i]);
    39     
    40     merge_sort(a,0,n - 1);
    41     
    42     cout << res;
    43     
    44     return 0;
    45 
    46 }
    View Code

    如果声明成局部变量,那每次调用merge_sort()时,都会创建一个 k,第一层中的 k 和第二层中的没关系
    如果声明成全局的,每一层中的 k 都是同一个,这一层中k变了,下一层也会变化,所以下层中的循环会“提前”结束.

    如果把 k 声明为全局变量,显然是不行的,你每次调用merge_sort()都会改变 k 的值,那么回溯后,其作为索引的意义就已经被破坏了。

    局部变量每次调用函数都不是同一个,全局变量则是同一个。因为函数有递归调用,如果是局部变量,每次调用的 k 都是相互独立的,
    而如果是全局变量,则是同样的 k。

  • 相关阅读:
    SQLdiag-配置文件-ProfilerCollector
    SQLdiag-配置文件-PerfmonCollector
    SQLdiag-初识
    Trace-跟踪高消耗的语句需添加哪些事件
    RML Utilities for SQL Server
    【译】第十五篇 Integration Services:SSIS参数
    修改数据文件和日志文件路径
    Trace-导出已有的服务器端跟踪
    iphoneX的适配问题
    添加阿里巴巴图标,让你页面小图标都是CSS3写成
  • 原文地址:https://www.cnblogs.com/ZhaoHaoFei/p/12317093.html
Copyright © 2011-2022 走看看