代码:
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是:如果你的条件都不满足…当期望返回一个数字时,该函数将不返回任何东西。