不匹配的类型.期望i32,发现()



代码:

fn ackermann(m: i32, n: i32) -> i32 {
    if m == 0 {
        return n + 1;
    } else if m > 0 && n == 0 {
        return ackermann(m - 1, 1);
    } else if m > 0 && n > 0 {
        return ackermann(m - 1, ackermann(m, n - 1));
    }
}

在编译时出现错误:

error: mismatched types [--explain E0308]
 --> src/main.rs:3:5
  |>
3 |>     if m == 0 {
  |>     ^ expected i32, found ()
note: expected type `i32`
note:    found type `()`

不是所有的代码路径都返回值。你可以用几种方法来解决这个问题。但由于这看起来是一个递归函数…您可能需要一种打破递归的方法:

fn ackermann(m: i32, n: i32) -> i32 {
    if m == 0 {
        return n + 1;
    } else if m > 0 && n == 0 {
        return ackermann(m - 1, 1);
    } else if m > 0 && n > 0 {
        return ackermann(m - 1, ackermann(m, n - 1));
    }
    return 0; // This breaks your recursion
}

或者,可能是显式的else:

if m == 0 {
    return n + 1;
} else if m > 0 && n == 0 {
    return ackermann(m - 1, 1);
} else if m > 0 && n > 0 {
    return ackermann(m - 1, ackermann(m, n - 1));
} else { // An explicit else also works
    return 0;
}

我还没有想过这个算法是做什么的…但错误是很明显的。如何打破递归并让函数返回实际值取决于您。

EDIT: Benjamin在注释中指出,这个特定的函数实际上不应该超出您提供的条件。因此,其他一些选项包括,如果代码确实输出,则panic',或者可能返回Result<i32>

TLDR是:如果你的条件都不满足…当期望返回一个数字时,该函数将不返回任何东西。

最新更新