我有两个类似的代码在声明变量为全球提供了不同的答案
代码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给出正确的输出(但运行时间更长)。如何解决这个问题?
构建一个调试版本,然后逐行调试程序中的代码以查看可能存在的差异。 –
您应该关注代码2,这是不起作用的,并逐步进行调试。 –
递归和共享可变状态是一个不愉快的组合。 – molbdnilo