#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 ); И не используйте идентификаторы, которые начинаются с символа подчеркивания или заканчиваются символом подчеркивания, а также идентификаторы, состоящие из одной заглавной буквы. Это плохой стиль программирования.
Комментариев нет:
Отправить комментарий