#cpp
В приведенной функции я создаю статический массив. Каким образом его можно единажды
обнулить, при первом входе в функцию?
typedef unsigned char uchar;
typedef unsigned long long int ullong;
// Рекурентный алгоритм нахождения F(n)
// F(n) - число Фибоначи, n - порядковый номер
ullong Fibonachi_Recursion_With_Memory(const uchar &_n)
{
static ullong *const M = new ullong[_n + 1]; // Динамически выделеный массив (который
нужно обнулить)
////////////////////////////////////////////////////////////////////// - (мой способ)
static bool emptyVector(false);
if(!emptyVector)
{
for(uchar i = 0; i <= _n; i++)
M[i] = 0;
emptyVector = true;
}
//////////////////////////////////////////////////////////////////////
if(_n <= 2)
return 1;
if(M[_n] != 0)
return M[_n];
return
M[_n] = Fibonachi_Recursion_With_Memory(_n - 1) + Fibonachi_Recursion_With_Memory(_n
- 2);
}
Ответы
Ответ 1
Легко! static ullong *const M = new ullong[_n + 1](); Будет работать и в C++03Ответ 2
Если ваш компилятор поддерживает C++ 2011, то вы можете написать просто static ullong *const M = new ullong[_n + 1] {}; В противном случае вы можете написать отдельную функцию для инициализации этого массива. Например, inline ullong * init( uchar n ) { ullong *p = new ullong[n]; std::memset( p, 0, n * sizeof( ullong ) ); return p; } и static ullong *const M = init( _n + 1 ); Или, опять-таки, если компилятор поддерживает, вы можете использовать лямбда-выражение, объявленное внутри функции перед объявлением static переменной. Например auto l = []( uchar n ) -> ullong * { int *p = new ullong[n]; return ( ullong * )std::memset( p, 0, n * sizeof( ullong ) ); }; static ullong *const M = l( _n + 1 ); И не используйте идентификаторы, которые начинаются с символа подчеркивания или заканчиваются символом подчеркивания, а также идентификаторы, состоящие из одной заглавной буквы. Это плохой стиль программирования.
Комментариев нет:
Отправить комментарий