Pull to refresh

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 совершенно бесполезно. Перешел на простой редактор.

Учить алгоритмы в принципе бессмысленно.

Там есть какие-то метаприёмы, которые желательно уметь. Но, насколько я понимаю, их никто до конца не выделил. То есть, "динамическое программирование", "разделяй-и-властвуй" + ещё несколько простых правил у всех на слуху, но не более того.

Посмотреть на то, как умные люди решают сложные задачи — всегда полезно. Учить — вряд ли :)

Sign up to leave a comment.

Articles