Почему моя функция Hailstone Sequence, использующая рекурсию, выдает только два значения? - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть следующий код:

fn hailSeq(number: i32) -> Vec<i32> {
    let mut vec = Vec::new();
    vec.push(number);
    if number == 1 {
        vec.push(1);
        return vec;
    }
    if number % 2 == 0 {
        let num = number / 2;
        vec.push(num);
        hailSeq(num);
    } else {
        let num = 3 * number + 1;
        vec.push(num);
        hailSeq(num);
    }
    return vec;
}

Он вычисляет последовательность Hailstone и останавливается на 1. Выход должен выглядеть следующим образом для hailSeq(11):

[11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]

Однако мой вывод выглядит так:

[11, 34]

Я не совсем уверен, почему это происходит. Возможно, в Rust есть предел рекурсии, о котором я не знаю, но я уверен, что в моем коде, вероятно, просто ошибка.

1 Ответ

0 голосов
/ 09 ноября 2018

Ваша проблема не связана с Rust, а имеет более общую проблему.

При каждом вызове hailSeq вы каждый раз создаете новый Vec, так что будет использоваться и возвращаться только первый vec (из первого вызова), следовательно, [11, 34] (11 из третья строка, 34 от десятой строки).

Чтобы исправить это, у вас есть два варианта, я предоставлю один здесь.

Первым было бы продлить текущий vec с помощью возвращенного vec, например. myvec.extend_from_slice(&returned_vec).

Второе решение заключается в создании vec при запуске и передаче одного и того же экземпляра при каждом вызове функции.

fn hail_seq(number: i32) -> Vec<i32> {
    fn inner(number: i32, vec: &mut Vec<i32>) {
        vec.push(number);
        if number == 1 {
            return;
        }
        if number % 2 == 0 {
            let num = number / 2;
            inner(num, vec);
        } else {
            let num = 3 * number + 1;
            inner(num, vec);
        }   
    }
    let mut v = vec![];
    inner(number, &mut v);
    v
}

fn main() {
    println!("{:?}", hail_seq(11));
}
* * Тысяча двадцать-одина ( площадка * * тысяча двадцать три)

В качестве примечания: если вы знаете, что число не может быть отрицательным, используйте u32 вместо этого, потому что вы найдете ошибки во время компиляции, а не во время выполнения.

...