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实现;)另见