当我将它初始化为 -1 时,为什么我的数组会被填充为零
Why would my array would be filled out to zero, when I initialised it to -1
#include<iostream>
using namespace std;
long long int memo[20] = {-1}; //create memo table and initialise to -1
long long int fibo(long long int n)
{
if(memo[n]>-1) //changing this to if(memo[n]>0) works fine
return memo[n]; //but as such this gives 0 from all my inputs
if(n<=2)
return 1;
memo[n] = fibo(n-1) + fibo(n-2); //recurse
return memo[n];
}
int main()
{
long long int n;
cin>>n;
cout<<fibo(n)<<endl; //calls the fibo function
for(int i=0;i<20;i++) //this prints my memo table used...
cout<<memo[i]<<" ";
}
我正在使用自上而下的 dp 计算第 n 个斐波那契数,但我的备忘录 table 被清零了。即使在我不接触的地方,为什么?
因为这就是 C++ 中数组初始化的工作方式。您将数组 memo
的 first 元素设置为 -1
,编译器将 value-initialize (before the C++11 standard) or default-initialize (自 C++11 及以后)所有其他元素。
long long int memo[20] = {-1};
实际上将 -1 设置为 仅第一个元素 。此后他们取值 0.
在你的情况下,鉴于斐波那契数列不包含零项,我将使用 0 而不是 -1 作为指标,并写成
long long memo[20] = {}; /*new C++ standards allow this, note that C doesn't*/
相反。
当你有
long long int memo[20] = {-1};
您没有告诉编译器用全 -1 初始化数组。你在这里告诉它的是一个初始化列表,并用它的内容初始化数组中的元素。由于列表小于数组,每个缺少的初始化程序都会导致编译器对相应元素进行零初始化。
您只是通过 {-1}
.
将第一个元素设置为 -1
以下是 C++ Programming Language Stroustrup 书中关于数组初始化器的摘录:
If the initializer supplies too few elements for an array, 0 is used for the rest. For example:
int v5[8] = { 1, 2, 3, 4 };
is equivalent to
int v5[] = { 1, 2, 3, 4 , 0, 0, 0, 0 };
所以你的情况 long long int memo[20] = {-1};
属于为数组提供的元素太少。
因为行
long long int memo[20] = {-1};
表示只有 memo 的第一个元素被初始化为零。
当你只输入"memo"时,它指的是一个指针,它保存着C++中数组第一个元素的地址。仅当由方括号指定时 - 例如 memo[3]-,或者当明确表示类似 "memo+3" 时,它将指向数组的索引。
你想要做的是声明所有索引并用 -1 值初始化它们。
long long int memo[20] = {[0 ... 20] = -1};
#include<iostream>
using namespace std;
long long int memo[20] = {-1}; //create memo table and initialise to -1
long long int fibo(long long int n)
{
if(memo[n]>-1) //changing this to if(memo[n]>0) works fine
return memo[n]; //but as such this gives 0 from all my inputs
if(n<=2)
return 1;
memo[n] = fibo(n-1) + fibo(n-2); //recurse
return memo[n];
}
int main()
{
long long int n;
cin>>n;
cout<<fibo(n)<<endl; //calls the fibo function
for(int i=0;i<20;i++) //this prints my memo table used...
cout<<memo[i]<<" ";
}
我正在使用自上而下的 dp 计算第 n 个斐波那契数,但我的备忘录 table 被清零了。即使在我不接触的地方,为什么?
因为这就是 C++ 中数组初始化的工作方式。您将数组 memo
的 first 元素设置为 -1
,编译器将 value-initialize (before the C++11 standard) or default-initialize (自 C++11 及以后)所有其他元素。
long long int memo[20] = {-1};
实际上将 -1 设置为 仅第一个元素 。此后他们取值 0.
在你的情况下,鉴于斐波那契数列不包含零项,我将使用 0 而不是 -1 作为指标,并写成
long long memo[20] = {}; /*new C++ standards allow this, note that C doesn't*/
相反。
当你有
long long int memo[20] = {-1};
您没有告诉编译器用全 -1 初始化数组。你在这里告诉它的是一个初始化列表,并用它的内容初始化数组中的元素。由于列表小于数组,每个缺少的初始化程序都会导致编译器对相应元素进行零初始化。
您只是通过 {-1}
.
-1
以下是 C++ Programming Language Stroustrup 书中关于数组初始化器的摘录:
If the initializer supplies too few elements for an array, 0 is used for the rest. For example:
int v5[8] = { 1, 2, 3, 4 };
is equivalent to
int v5[] = { 1, 2, 3, 4 , 0, 0, 0, 0 };
所以你的情况 long long int memo[20] = {-1};
属于为数组提供的元素太少。
因为行
long long int memo[20] = {-1};
表示只有 memo 的第一个元素被初始化为零。
当你只输入"memo"时,它指的是一个指针,它保存着C++中数组第一个元素的地址。仅当由方括号指定时 - 例如 memo[3]-,或者当明确表示类似 "memo+3" 时,它将指向数组的索引。
你想要做的是声明所有索引并用 -1 值初始化它们。
long long int memo[20] = {[0 ... 20] = -1};