Comments 8
В одном шаге от "Мистер Андерсон, ради чего вы продолжаете бороться?"
Перестаньте ставить уровень сложности "сложный" на поверхностные статьи
Со временем подкрутят, код будет все более качественным, доверия к нему больше.
Ваш код на расте сгниёт на относительно больших значениях входа, потому что в расте по умолчанию не предусмотрена TCO (а ваш код не озаботился к ней подготовиться).
Когда вы приводите пример с рекурсией, имеет смысл хотя бы немного понимать, как она работает. Вот работающий пример:
use num_bigint::{BigUint, ToBigUint};
use num_traits::One;
use tailcall::tailcall;
fn fibonacci(n: u32) -> BigUint {
#[tailcall]
fn do_fibonacci(pprev: BigUint, prev: BigUint, current: BigUint, total: BigUint) -> BigUint {
let one = BigUint::one();
if current >= total {
prev + pprev
} else {
let p = prev.clone();
let pp = prev.clone() + pprev.clone();
do_fibonacci(p, pp, current + one, total)
}
}
do_fibonacci(
BigUint::one(),
BigUint::one(),
2.to_biguint().unwrap(),
(n - 1).to_biguint().unwrap(),
)
}
fn main() {
println!("{}", fibonacci(100000));
}
А ваша «правильная» реализация на стотысячном числе отработает вот так (там тоже придется переписать на BigUint
’ах, но это не имеет значения:
thread 'main' has overflowed its stack
fatal runtime error: stack overflow
[1] 272895 IOT instruction (core dumped) ./target/debug/fi
Учить алгоритмы на Cursor IDE совершенно бесполезно. Перешел на простой редактор.
Учить алгоритмы в принципе бессмысленно.
Там есть какие-то метаприёмы, которые желательно уметь. Но, насколько я понимаю, их никто до конца не выделил. То есть, "динамическое программирование", "разделяй-и-властвуй" + ещё несколько простых правил у всех на слуху, но не более того.
Лучшие сервисы онлайн-психологов: честный разбор 15 платформ