为什么我的Hailstone Sequence函数使用递归仅输出两个值?

时间:2018-11-09 12:47:19

标签: recursion rust

我有以下代码:

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中对递归的限制,但是我敢肯定我的代码中可能只有一个错误。

1 个答案:

答案 0 :(得分:3)

您的问题不是Rust特有的,而是一个更普遍的问题。

在每次hailSeq的调用中,您每次都会创建一个新的Vec,因此仅使用第一个vec(来自第一次调用)并返回,因此{{ 1}}(第三行的[11, 34],第十行的11)。

要解决此问题,您有两个选择,我将在此处提供一个选择。

第一个方法是使用返回的34扩展当前的vec,例如vec

第二种解决方案涉及在启动时创建一个myvec.extend_from_slice(&returned_vec)并将相同的实例传递给该函数的每次调用。

vec

playground

作为旁注:如果您知道数字不能为负数,请改用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)); } ,因为您会在编译时而不是运行时发现错误。