Rustのclosureによる環境キャプチャーに関して質問です。
AtcoderのA-Frog1
を解いています。通常のコードはできたので、視点を変えて、
問題を漸化式に見立てて、再帰関数を用いてメモ化することで
解こうとしています。
- rustc 1.57.0
Rustメモ化なし
1use proconio::input; 2use std::cmp::min; 3 4fn recurse<X, Y>(x: X, f: &dyn Fn(X, &dyn Fn(X) -> Y) -> Y) -> Y { 5 f(x, &|x: X| recurse(x, &f)) 6} 7fn main() { 8 input! { 9 n:usize, 10 cost:[i64;n], 11 } 12 let inf = i64::MAX; 13 let mut dp = vec![inf;n]; 14 dp[0] = 0; 15 dp[1] = (cost[1]-cost[0]).abs(); 16 17 let rec = recurse(n-1, &|i:usize,rec|{ 18 if i == 0{ 19 return dp[0] 20 } 21 else if i ==1{ 22 return dp[1] 23 } 24 else{ 25 let mut res = std::i64::MAX; 26 res = min(res,rec(i-1)+(cost[i]-cost[i-1]).abs()); 27 res = min(res,rec(i-2)+(cost[i]-cost[i-2]).abs()); 28 29 return res 30 } 31 }); 32 println!("{}",rec); 33}
上記メモ化なしは問題ないのですが、
Rustメモ化あり
1use proconio::input; 2use std::cmp::min; 3 4fn recurse<X, Y>(x: X, f: &dyn Fn(X, &dyn Fn(X) -> Y) -> Y) -> Y { 5 f(x, &|x: X| recurse(x, &f)) 6} 7fn main() { 8 input! { 9 n:usize, 10 cost:[i64;n], 11 } 12 let inf = i64::MAX; 13 let mut dp = vec![inf;n]; 14 dp[0] = 0; 15 dp[1] = (cost[1]-cost[0]).abs(); 16 17 let rec = recurse(n-1, &|i:usize,rec|{ 18 if dp[i] < inf{ //追加 19 return dp[i] //追加 20 } //追加 21 if i == 0{ 22 return dp[0] 23 } 24 else if i ==1{ 25 return dp[1] 26 } 27 else{ 28 let mut res = std::i64::MAX; 29 res = min(res,rec(i-1)+(cost[i]-cost[i-1]).abs()); 30 res = min(res,rec(i-2)+(cost[i]-cost[i-2]).abs()); 31 dp[i] = res; //追加 32 return res 33 } 34 }); 35 println!("{}",rec); 36} 37
とすると、
Rust
1cannot borrow `dp` as mutable, as it is a captured variable in a `Fn` closure 2cannot borrow as mutable
とエラーメッセージがでてしまいます。
キャプチャーされた環境をmutableで持ってくるには
どうしたらいいのでしょうか?
よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/16 08:28