我有以下代码:
ansible
它计算Hailstone sequence并停在1。对于environment
,输出应如下所示:
---
- hosts: localhost
environment:
- PATH: '/opt/ant/apache-ant-1.10.5/bin:{{ ansible_env.PATH }}'
tasks:
- name: execute ant build
local_action:
module: shell
args: ant
chdir: "{{ lookup('env', 'WORKSPACE') }}"
register: ant_build
...
但是,我的输出看起来像这样:
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;
}
我不太确定为什么会这样。也许我不知道Rust中对递归的限制,但是我敢肯定我的代码中可能只有一个错误。
答案 0 :(得分:3)
您的问题不是Rust特有的,而是一个更普遍的问题。
在每次hailSeq
的调用中,您每次都会创建一个新的Vec
,因此仅使用第一个vec
(来自第一次调用)并返回,因此{{ 1}}(第三行的[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));
}
,因为您会在编译时而不是运行时发现错误。