2

我有以下代码:

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;
}

它计算冰雹序列并在 1 处停止。输出应如下所示hailSeq(11)

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

但是,我的输出如下所示:

[11, 34]

我不确定为什么会发生这种情况。也许 Rust 中存在我不知道的递归限制,但我确信我的代码中可能只是一个错误。

4

1 回答 1

3

您的问题不是特定于 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));
}

操场

附带说明:如果您知道数字不能为负数,请改用 a ,u32因为您会在编译时而不是运行时发现错误。

于 2018-11-09T12:59:28.360 回答