Ну по идее алгоритм-то прост: не пополнять словарь, если в нём уже есть определённое кол-во элементов. Но делать каждый раз проверку вряд ли стоит
Это стратегии кеширования. Вы предлагаете вшить какую-то константу в код - скажем, 100 раз пополнять, а потом не пополнять?
Есть еще стратегия кешировать последние n и выкидывать ранние, кешировать n наиболее часто используемых.
Но в приведенной задаче ЛЮБАЯ стратегия кеширования будет приводить к нерабочему алгоритму
Написал как умел свой кэш для 4 значений и дождался результата за приемлемое время:
const knom=4;
var max,rez,nom:integer;
r,m:array[1..knom] of integer;
function F(n:integer):integer;
begin
if n=0 then
begin
result:=0;
exit
end;
for var i:=1 to knom do
if n=m[i] then
begin
result:=r[i];
exit
end;
if n mod 3 = 0
then result:=F(n div 3)
else result:=F(n-1)+1;
if nom=knom then nom:=1 else nom:=nom+1;
m[nom]:=n;
r[nom]:=result
end;
begin
nom:=0;
for var i:=1700000000 to 2100000000 do
begin
rez:=F(i);
if max<rez then max:=rez
end;
write(max, ' время работы = ', Milliseconds/1000, ' сек.');
end.
Так и не понял зачем завершать работу программы аварийно при использовании [cache].
Это правильно. Такой код надо писать руками.
А вы не считали, сколько различных значений n возникает в вашей задаче?
Вопрос закрыт. Всем спасибо.
Существует ли стандартный тип целого с произвольными максимальным и минимальным значениями? Чтобы не занимал ненужные биты. Что-то вроде размерной строки. На случай, если вдруг мне понадобится оперировать в ОЗУ со множеством значений такого типа. Чтобы не использовать битовые поля.
При чём тут битовые поля?
Размерных строк не существует, но даже если бы были - они занимали бы больше места чем обычные, потому что обычные всегда выделяют минимум памяти под своё представление. Единственное преимущество которое можно было бы достичь - хранение в стеке вместо кучи.
Ближайший стандартный тип это диапазон (var a: 5..7
), но внутри он всегда integer
. Если очень надо оптимизацию для конкретного случая - пишите кодогенераторы, чтобы создавать новый тип для каждого варианта диапазона.
Я имел в виду
, например, uint2
или int37
.
значением uint2
является 2**2 - 1 = 3.
В
, например, uint64
можно сохранить 64 / 2 = 32 uint2
. Ближайшее по размеру целое — байт. Если хранить 32 uint2
в виде byte
, а не uint64
, неиспользуемыми останутся (8 - 2) * 32 = 192 бита.
Итак, существуют ли такие стандартные целые типы:
1.
постоянным размером? У BigInteger
, как известно, размер переменный.
OR
2. Переменные которого
? BigInteger
хранит числа в виде array of integer
, а это не
.
А, то если для 255..256
вы хотели бы выделять uint9
, вместо uint1
, потому что в 256 не помещается в максимальное для uint8
?)))
В любом случае, даже если не делать такие глупости, а зашивать и минимальное и максимальное в тип - такие вещи аппаратно не поддерживаются. И выделить память (не важно на стеке или в куче), у которой размер не будет кратен 8 битам - не выйдет.
Поэтому я говорю что лучшее решение - кодогенерация.
При чём тут строки к BigInteger
?
Строки в .Net таки выделяют в куче столько памяти, сколько нужно под текущие символы, без запаса.
А заменив внутренний массив в BigInteger
на array of byte
вы съэкономите максимум 3 байта, взамен на тонну производительности.
Добрый день. Есть вопрос по модулю Turtle. Можете привести пример работы процедуры SetColor в этом модуле. Много чего пробовал, но задать цвет пера так и не смог. Подключил GraphWPF и только тогда смог задать цвет пера. В справке указано, что цвет задается как тип GColor, который в свою очередь является синонимом System.Window.Media.Color. Более ничего про это в справке нет. Можно простой пример использования этой команды без подключения дополнительных модулей. Создавать новую тему на стал - вопрос простой
Ну так раз синоним, значит можно использовать System.Window.Media.Color
там, где с GraphWPF
будет GColor
. Или сделать свой синоним, в секции type
:
MyColorSynonym = System.Window.Media.Color;
Хотя, конечно, такой синоним должен быть и в модуле Turtle
…
GColor прописан в модуле GraphWPF как синоним.
В Turtle описана процедура
/// Устанавливает цвет линии
procedure SetColor(c: GColor) := Pen.Color := c;
Вопрос был в другом: “Как задать цвет пера в программе?”. Нужен один простой пример. Не нашел примеров и для модуля GraphWPF. Плохо искал? Укажите направление поиска
Скачайте версию. Теперь так:
uses Turtle;
begin
SetColor(Colors.Green);
Down;
Forw(100);
end.
Спасибо. Заработало только в версии от 20.09.2022 г.
В более ранних версиях 3.8.3 работать отказывалось.
Я так понял, что Черепаха “понимает” только базовые цвета. Ей не доступны clRandom и функция RGB, которые работают только после подключения модуля GraphWPF.
Подключите одновременно модуль GraphWPF если этого хотите )
А есть другой способ? Было бы неплохо с ним ознакомиться
Есть - посмотрев таки на System.Window.Media.Color
и его документацию:
Вы могли найти этот метод и сами: Когда вы пишете System.Window.Media
и ставите после него точку - вам показывает всё что есть в этом типе.
Спасибо, ознакомлюсь конечно. Но я исходил из того, что модуль Черепаха разработан для начального обучения программированию. Полагаю, что в самом начале программирования точечные нотации будут не самым удобным способом писать программы.
Здравствуйте. Сразу извиняюсь за неграмотность. Мне 63 года и оформлять сообщение в формате Markdown я не умею. и многого чего не умею, что ныне как бы подразумевается в приличных компаниях. У меня такая проблема возникла. Мне надо преобразовывать числа uint64 в строки. Я прочитал в справке, что есть два варианта функции IntToStr/ Один вариант принимает параметр типа integer, другой - int64. На практике, попробовав предложить функции IntToStr число 1011001110001111, получил результат ‘168261079’. В чём дело? Некорректная реализация функции IntToStr или я что-то не так понял и не так делаю? Спасибо.