Je pensais que la réécriture "puzzles mathématiques qui entraînent davantage le cerveau du programmeur" avec Rust pourrait être juste pour éviter le flou.
Code Ruby original (p.015).
pre1_2.rb
M, N = 10, 100
@memo = {}
def check(remain, pre)
return @memo[[remain, pre]] if @memo[[remain,pre]]
return 0 if remain < 0
return 1 if remain == 0
cnt = 0
pre.upto(M) do |i|
cnt += check(remain - i, i)
end
@memo[[remain, pre]] = cnt
end
puts check(N, 2)
Greffe solide de rouille.
main.rs
use std::collections::HashMap;
fn main() {
let mut memo: HashMap<(i64, i64), i64> = HashMap::new();
println!("{}", check(&mut memo, 10, 100, 2));
}
fn check(
memo: &mut HashMap<(i64, i64), i64>,
max_seat_at_one_table: i64,
remain: i64,
pre: i64,
) -> i64 {
match memo.get(&(remain, pre)) {
Some(cnt) => return *cnt,
_ => {
if remain < 0 {
return 0;
} else if remain == 0 {
return 1;
} else {
let mut count = 0;
for i in pre..=max_seat_at_one_table {
count += check(memo, max_seat_at_one_table, remain - i, i);
}
memo.insert((remain, pre), count);
return count;
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_check() {
let max_seat_at_one_table = 10;
let number_of_people = 100;
let mut memo: HashMap<(i64, i64), i64> = HashMap::new();
assert_eq!(
check(&mut memo, max_seat_at_one_table, number_of_people, 2),
437_420
);
}
}
Pour que Rust's for
fasse la même chose que Rubyupto
, vous devez +1.
Si vous pensez, @scivola a souligné. Je vous remercie!
C'est une variable globale que je ne pense pas dans le code court de Ruby, mais je la transporte parce que je ne sais pas comment le faire avec Rust. Bien que ce soit également dans la critique de livre d'Amazon, si vous omettez la variable comme les mathématiques, ce sera incompréhensible, alors je ne lui ai fait un nom long que dans la partie terrible.
Une fois encore, je ressens la facilité de Ruby (= confiance dans le programmeur) dans le traitement du branchement conditionnel. La rouille est compacte mais ne lui permet pas de se détacher, mais c'est une bonne sensation.
Implémenté à nouveau après avoir été signalé sur la gestion des variables globales. Un plan pour réaliser des variables globales comme struct
. C'est déjà un pied dans le modèle de conception.
main.rs
use std::collections::HashMap;
struct Checker {
memo: HashMap<(i64, i64), i64>,
max_seat_at_one_table: i64,
}
impl Checker {
pub fn check(&mut self, remain: i64, pre: i64) -> i64 {
match &self.memo.get(&(remain, pre)) {
Some(cnt) => return **cnt,
_ => {
if remain < 0 {
return 0;
} else if remain == 0 {
return 1;
} else {
let mut count = 0;
for i in pre..=self.max_seat_at_one_table {
count += self.check(remain - i, i);
}
&self.memo.insert((remain, pre), count);
return count;
}
}
}
}
}
fn main() {
let mut chk = Checker {
memo: HashMap::new(),
max_seat_at_one_table: 10,
};
println!("{}", chk.check(100, 2));
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_check() {
let number_of_people = 100;
let mut chk = Checker {
memo: HashMap::new(),
max_seat_at_one_table: 10,
};
assert_eq!(chk.check(number_of_people, 2), 437_420);
}
}