Recursion 为什么使用递归的冰雹序列函数只输出两个值?

Recursion 为什么使用递归的冰雹序列函数只输出两个值?,recursion,rust,Recursion,Rust,我有以下代码: 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

我有以下代码:

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;
}
但是,我的输出如下所示:

[11,34]

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

您的问题不是特定于Rust的,而是一个更一般的问题

每次调用
hailSeq
时,您都会创建一个新的
Vec
,这样只有第一个
Vec
(从第一次调用开始)会被使用和返回,因此
[11,34]
(第三行的
11
,第十行的
34

要解决这个问题,您有两个选择,我将在这里提供一个

第一种方法是使用返回的
vec
扩展当前
vec
,例如
myvec.extend\u from_slice(&returned\u 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));
}
fn hail_seq(编号:i32)->Vec{
fn内部(编号:i32,vec:&mut vec){
矢量推送(数字);
如果数字==1{
返回;
}
如果数字%2==0{
设num=number/2;
内(num,vec);
}否则{
设num=3*number+1;
内(num,vec);
}   
}
设mut v=vec![];
内部(编号和编号v);
v
}
fn main(){
println!(“{:?}”,见下文(11));
}
()


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

请下次使用
rustfmt
正确格式化代码。其次,在rust中,我们不使用camelCase,而是使用snake_case,例如,您的函数名应该是hail_seq。第三,不要对最后一条语句使用显式的
返回,这是非常不可靠的。只需编写
vec
(不带返回和
),您可以解释或链接如何生成hail序列。Rust中更惯用的是to。有趣的是,我添加的链接上有一个Rust实现;)另见