#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个Fibonacci数,但我的备忘录表已清零。即使在我不感动的地方,为什么呢?
答案 0 :(得分:6)
当你有
时long long int memo[20] = {-1};
您没有告诉编译器使用全-1来初始化数组。你要告诉它的是一个初始化列表,并用它的内容初始化数组中的元素。由于列表小于数组,因此每个缺少的初始化程序都会导致编译器将零初始化为相应的元素。
答案 1 :(得分:4)
因为这是数组初始化在C ++中的工作原理。您将数组memo
的第一个元素设置为-1
,编译器将value-initialize(在C ++ 11标准之前)或{{3} (自C ++ 11及以后)所有其他元素。
请详细了解default-initialize。
答案 2 :(得分:1)
long long int memo[20] = {-1};
实际上将-1设置为仅第一个元素。此后,他们取值0。
在你的情况下,假设Fibonacci系列不包含零项,我使用0而不是-1作为指标,并写
long long memo[20] = {}; /*new C++ standards allow this, note that C doesn't*/
代替。
答案 3 :(得分:1)
您只需通过-1
设置{-1}
的第一个元素。
以下是关于Array Initializer的C ++ Programming Language Stroustrup一书的摘录:
如果初始化程序为数组提供的元素太少,则其余部分使用0。例如:
int v5[8] = { 1, 2, 3, 4 };
相当于
int v5[] = { 1, 2, 3, 4 , 0, 0, 0, 0 };
所以你的案例long long int memo[20] = {-1};
来自为数组提供的元素太少。
答案 4 :(得分:1)
因为行
long long int memo[20] = {-1};
指出只有备忘录的第一个元素被初始化为零。
当您输入&#34;备忘录&#34;只是,它指的是一个指针,它用C ++保存数组的第一个元素的地址。只有当用方括号指定时 - 例如memo [3] - ,或明确说出类似&#34; memo + 3&#34;它将指向数组的索引。
你想要做的是陈述所有索引并用-1值初始化它们。
long long int memo[20] = {[0 ... 20] = -1};