2016-09-16 20 views
2

このコード:タイプが一致しません。予想I32、見つかっ()

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'だけを使うことができます。 (おそらく 'm'と' u64'の残りの 'u8'がより適切でしょう) – 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; 
} 

私はこのアルゴリズムが何であるかについてはあまり考えていませんが、エラーはかなり明確です。どのようにあなたの再帰を壊し、関数が実際の値を返すかは、あなた次第です。

EDIT:ベンジャミンは、この特定の機能は、あなたが提供した条件の外に実際に到達すべきではないとコメントで指摘しています。そのようなものとして、コードが出てこない場合はパニックを起こすか、代わりにResult<i32>を返すなどのオプションがあります。

TLDRは次のとおりです。条件が満たされていない場合は、数値を返すと予想されるときに関数は何も返しません。

+1

あるいは、これらの3つ以外の引数の組み合わせに対してackermann関数が定義されていないので、おそらく関数はパニックに陥るでしょう。どちらかというと、代わりに 'Result'を返さなければなりません。 –

+0

Benjaminに感謝します。私はその細目を見直さなかった。あなたのコメントごとにいくつかのオプションを追加します。 –

+0

助けてくれてありがとう。また、関数についてはあまりにも難しくは考えないでください。計算が難しいと思われます。 https://en.wikipedia.org/wiki/Ackermann_function –

関連する問題