此代码:
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 `()`
答案 0 :(得分:8)
并非所有代码路径都返回值。你可以通过几种方式解决这个问题..但是因为这似乎是一个递归函数..你可能想要一种方法来打破递归:
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;
}
我没有太多考虑这个算法是什么/做什么..但错误很清楚。如何打破递归并让函数返回实际值取决于您。
编辑:本杰明在评论中指出,这个特定的功能实际上不应该超出你提供的条件。因此,其他一些选项包括如果代码确实消失或者可能返回Result<i32>
而发生恐慌。
TLDR是:如果你的条件都没有满足..那么当函数预期返回一个数字时,函数不会返回任何内容。