21/08/10 02:13:08.50 KzRmJx3E.net
>>570
グローバル変数の代わりに関数の引数を増やすと毎回連れ回す形で見にくくなるけれど
再帰関数ではなく再帰メソッドにしてしまえば引数を増やさずにいくらでもパラメータを使えます
例えば「再帰で1からnまでの和や積」を求める例で「差分diff」が可変パラメータとした場合
struct Arith { diff: i32 }
impl Arith {
fn sum(&self, n: i32) -> i32 { if n <= 0 { 0 } else { n + self.sum(n - self.diff) } }
fn mul(&self, n: i32) -> i32 { if n <= 1 { 1 } else { n * self.mul(n - self.diff) } }
}
fn main() {
let diff1 = Arith { diff: 1 };
assert_eq!(diff1.sum(10), 55); // 1+2+3+4+5+6+7+8+9+10
assert_eq!(diff1.mul(7), 5040); // 1*2*3*4*5*6*7
let diff2 = Arith { diff: 2 };
assert_eq!(diff2.sum(10), 30); // 2+4+6+8+10
assert_eq!(diff2.mul(7), 105); // 1*3*5*7
}
今回はdiffの部分が1個だけですが複数のパラメータにもできます
こうすることで「グローバル変数を使わず」&「引数を毎回連れ回さず」に書けます