这段代码:
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));
}
}
Run Code Online (Sandbox Code Playgroud)
编译时出错:
error: mismatched types [--explain E0308]
--> src/main.rs:3:5
|>
3 |> if m == 0 {
|> ^ expected i32, found ()
note: expected type `i32`
note: found type `()`
Run Code Online (Sandbox Code Playgroud)
并非所有代码路径都返回值.你可以通过几种方式解决这个问题..但是因为这似乎是一个递归函数..你可能想要一种方法来打破递归:
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
}
Run Code Online (Sandbox Code Playgroud)
或者,也许是明确的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;
}
Run Code Online (Sandbox Code Playgroud)
我没有太多考虑这个算法是什么/做什么..但错误很清楚.如何打破递归并让函数返回实际值取决于您.
编辑:本杰明在评论中指出,这个特定的功能实际上不应该超出你提供的条件.因此,一些其他选项包括恐慌,如果代码确实出来或可能返回Result<i32>
.
TLDR是:如果没有满足您的条件..那么当函数预期返回一个数字时,该函数将不会返回任何内容.