前回のエントリに対して Twitter でアドバイスをいただき、色々と改良できた。
Problem 3 修正版1
isPrimeFactor だった場合、n が m の二乗でも割れるかもしれないので、
m で割れるだけ割るため divide 関数を用意した。
divide 関数では、divMod を使用して商と余りを一度に出している。
また、 n を素因数分解するとき、2 ~ sqrt(n) までの数字を調べればよいので、
再帰の終了条件を n < m ^ 2 = n:list とした。
(参考:素因数分解は2~平方根まででOK|虚苦心のブログ)
Problem 3 修正版2
さらに修正したバージョンがこちら。
再帰の終了条件になったら n を加えたリストを返して、その head を取っているので
そもそも素因数を list に持ち続ける必要がなくなったため、引数から除外。
isPrimeFactor 関数で検査しなくても、n が m で割り切れない場合、divide 関数が n を返すので
isPrimeFactor 関数を除外。
divide 関数で割れるだけ割った結果 1 になった場合の m はその時点での唯一の素因数なので、
再帰の終了条件に divided == 1 = m を追加。

Copyright© 2011-2021 Shunsuke Otani All Right Reserved .