2016-09-16 56 views
2

此代碼:不匹配的類型。預計123-132,()找到

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

您可以使用'u32'和'else'作爲最後一個分支。 (可能'u8'代表'm'和'u64'代替其他代碼會更合適。) – starblue

回答

7

並不是所有的代碼路徑返回一個值。你可以解決這個問題的一些方法..但因爲這似乎是一個遞歸函數..你可能想辦法打破遞歸:

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是:如果您的條件都不符合,那麼函數在預期返回一個數字時不會返回任何內容。

+1

或者這個函數應該恐慌,因爲ackermann函數沒有爲這三個參數組合定義。無論是它還是它應該返回一個'Result'。 –

+0

謝謝本傑明。我沒有審查具體細節。我會根據您的評論添加其他一些選項。 –

+0

感謝您的幫助。另外,不要過多地考慮函數,它應該很難計算。 https://en.wikipedia.org/wiki/Ackermann_function –

相關問題