这段代码:
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:本杰明在评论中指出,这个特定函数实际上不应该达到您提供的条件之外。因此,其他一些选项包括如果代码确实泄露或可能返回则出现恐慌Result<i32>
反而。
TLDR 是:如果您的条件均不满足......那么该函数在预期返回数字时将不会返回任何内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)