Size: a a a

Rust — русскоговорящее сообщество

2021 June 13

RC

Roman Chumak in Rust — русскоговорящее сообщество
пример достаточно синтетический, но хочется подружить хэшмапу с рекурсией
источник

Э

Эрик in Rust — русскоговорящее сообщество
Сильно зависит от конкретных примеров, в данном случае хашмапа не нужна, да и код работает, какая разница, будет ли он однострочником.
источник

RC

Roman Chumak in Rust — русскоговорящее сообщество
в примере нахождение энного числа последовательности Фибоначчи, с использованием приёмов динамического программирования, мемоизации просчитанных значений.
источник

RC

Roman Chumak in Rust — русскоговорящее сообщество
понятно, что можно и так. только я так ничему новому не научусь = )
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
Через itertools::unfold попробуй
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
Там будет ограниченная мемоизация в форме следующих двух элементов последовательности
источник

RC

Roman Chumak in Rust — русскоговорящее сообщество
так это ж без рекурсии?
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
Ну да, только рекуррентное соотношение всё равно будет задано, и итератор можно будет коллектнуть
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
а ещё можно матрицу перемножать. Тогда можно куда быстрее ответ получить. И тут уже можно магии научитьсЯ)
источник

RC

Roman Chumak in Rust — русскоговорящее сообщество
ok, круто! https://habr.com/ru/post/261159/
правда, я не за этим пришёл, но спасибо! = )
источник

RC

Roman Chumak in Rust — русскоговорящее сообщество
тогда вопрос наверно сводится к владению.. в методе рекурсию нельзя?
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
если вмесо скриншота кидать на плейграунд ссылку то ответ будет куда чаще и быстрее
источник

Э

Эрик in Rust — русскоговорящее сообщество
Во-первых, or_insert жадно вычисляет передаваемые аргументы, использовать тут надо or_insert_with. Во-вторых, у тебя незаполненный entry, а ты пытаешься в хашмапу запихать ещё значения. Это та же фигня, которая происходит при запихивании значений в вектор, пока итератор в этот вектор ещё жив.
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
entry может инвалидироваться в результате изменения содержимого мапы, поэтому там и не работает .or_insert_with (который вообще-то стоило использовать вместо .or_insert). Ещё с такой рекурсией будут проблемы в виде переполнения стека: просматривать нужно глубоко, когда впервые от большого числа считаешь.
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
ну это то же дин программирование, только цикл в итератор пихнули..

Не понял какую роль filter играет
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
Ограничение на переполнение u64
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
сделал бы толгда checked_add
источник

ΑZ

Αλεχ Zhukovsky in Rust — русскоговорящее сообщество
use itertools::unfold;

fn fib() -> impl Iterator<Item = u64> {
   unfold((0u64, 1u64), |x| {
       let ret = x.0;
       x.0 = x.1;
       x.1 = x.1.checked_add(ret)?;
       Some(ret)
   })
}

fn main() {
   let fib: Vec<_> = fib().take(10).collect();
   println!("{:?}", fib);
}
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
Не, так можно максимум элементов выжать и эффективнее чутка
источник