I need some guidance how to approach a recursive function that needs to mutate the vectors that are provided to it from previous recursion level.
fn solve (graph: &CompleteGraph) -> Path {
let mut path = Path { cities: Vec::<usize>::new() };
let mut visited = Visited { cities: vec!(false; graph.numcities) };
let since = Instant::now();
let bestpath = Path { cities: trivialpath(&graph) };
let besttotal = pathtotal(&bestpath.cities, &graph);
let (path, visited, bestpath, besttotal) = solverec(path, 0.0, visited, since, bestpath, besttotal);
return bestpath;
}
fn solverec (path: Path, pathtotal: f64, visited: Visited, since: Instant, bestpath: Path, besttotal: f64) -> (Path, Visited, Path, f64) {
if since.elapsed() > Duration::from_secs(5) {
return (path, visited, bestpath, besttotal);
}
if pathtotal > besttotal {
return (path, visited, bestpath, besttotal);
}
for nextcity in 0..visited.cities.len() {
if visited.cities[nextcity] == false {
path.cities.push(nextcity);
visited.cities[nextcity] = true;
let (path, visited, bestpath, besttotal) = solverec(path, pathtotal, visited, since, bestpath, besttotal);
visited.cities[nextcity] = false;
path.cities.pop();
}
}
unimplemented!();
}
Compiler complains a lot:
error[E0382]: borrow of moved value: `visited`
--> tsp-arekbulski-05-brute.rs:123:6
|
113 | ...verec (path: Path, pathtotal: f64, visited: Visited, since: Instant, bestpath: Path, best...
| ------- move occurs because `visited` has type `Visited`, which does not implement the `Copy` trait
...
123 | ...isited.cities[nextcity] == false {
| ^^^^^^^^^^^^^^ value borrowed here after move
...
126 | ... (path, visited, bestpath, besttotal) = solverec(path, pathtotal, visited, since, bestpat...
| ------- value moved here, in previous iteration of loop
error[E0596]: cannot borrow `path.cities` as mutable, as `path` is not declared as mutable
--> tsp-arekbulski-05-brute.rs:124:4
|
113 | fn solverec (path: Path, pathtotal: f64, visited: Visited, since: Instant, bestpath: Path, b...
| ---- help: consider changing this to be mutable: `mut path`
...
124 | path.cities.push(nextcity);
| ^^^^^^^^^^^ cannot borrow as mutable
error[E0382]: borrow of moved value: `path`
--> tsp-arekbulski-05-brute.rs:124:4
|
113 | fn solverec (path: Path, pathtotal: f64, visited: Visited, since: Instant, bestpath: Path, b...
| ---- move occurs because `path` has type `Path`, which does not implement the `Copy` trait
...
124 | path.cities.push(nextcity);
| ^^^^^^^^^^^ value borrowed here after move
125 | visited.cities[nextcity] = true;
126 | let (path, visited, bestpath, besttotal) = solverec(path, pathtotal, visited, since, best...
| ---- value moved here, in previous iteration of loop
error[E0596]: cannot borrow `visited.cities` as mutable, as `visited` is not declared as mutable
--> tsp-arekbulski-05-brute.rs:125:4
|
113 | fn solverec (path: Path, pathtotal: f64, visited: Visited, since: Instant, bestpath: Path, b...
| ------- help: consider changing this to be mutable: `mut visited`
...
125 | visited.cities[nextcity] = true;
| ^^^^^^^^^^^^^^ cannot borrow as mutable
error[E0382]: use of moved value: `bestpath`
--> tsp-arekbulski-05-brute.rs:126:89
|
113 | ...sited, since: Instant, bestpath: Path, besttotal: f64) -> (Path, Visited, Path, f64) {
| -------- move occurs because `bestpath` has type `Path`, which does not implement the `Copy` trait
...
126 | ...ec(path, pathtotal, visited, since, bestpath, besttotal);
| ^^^^^^^^ value moved here, in previous iteration of loop
error[E0596]: cannot borrow `visited.cities` as mutable, as `visited` is not declared as mutable
--> tsp-arekbulski-05-brute.rs:127:4
|
126 | let (path, visited, bestpath, besttotal) = solverec(path, pathtotal, visited, since, best...
| ------- help: consider changing this to be mutable: `mut visited`
127 | visited.cities[nextcity] = false;
| ^^^^^^^^^^^^^^ cannot borrow as mutable
error[E0596]: cannot borrow `path.cities` as mutable, as `path` is not declared as mutable
--> tsp-arekbulski-05-brute.rs:128:4
|
126 | let (path, visited, bestpath, besttotal) = solverec(path, pathtotal, visited, since, best...
| ---- help: consider changing this to be mutable: `mut path`
127 | visited.cities[nextcity] = false;
128 | path.cities.pop();
| ^^^^^^^^^^^ cannot borrow as mutable
error: aborting due to 7 previous errors; 7 warnings emitted