2015-02-26 54 views
0

我有两个类似的代码在声明变量为全球提供了不同的答案

代码1:

#include <bits/stdc++.h> 

using namespace std; 

long long int MOD = 1000000007; 

long long int fib(long long int n) 
{ 
    if(n <= 2) 
     return 1; 
    long long int k = n/2; 
    long long int a = fib(k+1); 
    long long int b = fib(k); 
    if(n%2 == 1) 
     return (a*a + b*b)%MOD; 
    else 
    { 
     long long c = 2*a - b; 
     if(c < 0) 
      c+=MOD; 
     return (b*(c))%MOD; 
    } 
} 

int main() 
{ 
    long long int n; 
    scanf("%lld",&n); 
    printf("%lld\n", fib(n)); 
    return 0; 
} 

在这里,我定义变量k,a,b局部变量。对于n = 100000000,输出为908460138

代码2:

#include <bits/stdc++.h> 

using namespace std; 

long long int MOD = 1000000007; 

long long int a,b,c,d,k; 

long long int fib(long long int n) 
{ 
    if(n <= 2) 
     return 1; 
    k = n/2; 
    a = fib(k+1); 
    b = fib(k); 
    if(n%2 == 1) 
     return (a*a + b*b)%MOD; 
    else 
    { 
     c = 2*a - b; 
     if(c < 0) 
      c+=MOD; 
     return (b*(c))%MOD; 
    } 
} 

int main() 
{ 
    long long int n; 
    scanf("%lld",&n); 
    printf("%lld\n", fib(n)); 
    return 0; 
} 

在这里,我定义变量k,a,b为全局变量。对于n = 100000000,输出为265038576

任何人都可以解释为什么我得到这种差异的输出。 Code1给出正确的输出(但运行时间更长)。如何解决这个问题?

+1

构建一个调试版本,然后逐行调试程序中的代码以查看可能存在的差异。 –

+0

您应该关注代码2,这是不起作用的,并逐步进行调试。 –

+0

递归和共享可变状态是一个不愉快的组合。 – molbdnilo

回答

3

当使用局部变量时,你有'几个'局部变量a,b,c,d,k(一个独立的范围)。

使用全局变量时,你与不同的呼叫变量分享到fib

所以

a = fib(k+1); 
b = fib(k); 

的第二个电话会修改以前ka(如果k> 2)等有当前通话的副作用。

+0

k独自分享吧?但是将k声明为局部变量也无济于事。 – vinayawsm

+0

所有的全局变量都是共享的,'k'和'​​a'确实存在问题,'b'和'c'用法足以本地不存在问题。仍然更喜欢局部变量。 – Jarod42