Помощь новичкам

Ну по идее алгоритм-то прост: не пополнять словарь, если в нём уже есть определённое кол-во элементов. Но делать каждый раз проверку вряд ли стоит

1 лайк

Это стратегии кеширования. Вы предлагаете вшить какую-то константу в код - скажем, 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 или я что-то не так понял и не так делаю? Спасибо.

изображение