回答編集履歴

2

第二の選択を追加

2016/11/24 22:31

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -68,7 +68,41 @@
68
68
 
69
69
 
70
70
 
71
+ 末尾呼び出し最適化は卑怯だ…でもやり方は変えたくないと言うのであれば、単純に次の約数を見つけるとすればいいかと思います。次の呼び出しは約数が見つかったときだけでもいいのですから。
72
+
73
+
74
+
75
+ ```Ruby
76
+
77
+ # frozen_string_literal: true
78
+
79
+ def divisors_all(m)
80
+
81
+ divisors_all_r(m, 1, [])
82
+
83
+ end
84
+
85
+
86
+
87
+ def divisors_all_r(m, k, divisors)
88
+
89
+ d = (k..m).find { |i| m % i == 0 }
90
+
91
+ return divisors unless d
92
+
93
+ divisors_all_r(m, d + 1, divisors + [d])
94
+
95
+ end
96
+
97
+
98
+
99
+ p divisors_all(10000)
100
+
101
+ ```
102
+
103
+
104
+
71
- ただ、今回の全ての約数を求めるということであれば、素因数分解して、全ての組合せをかけた物をリストにした方がいいかもしません。
105
+ ただ、今回の全ての約数を求めるということだけが条件であれば、素因数分解して、全ての組合せをかけた物をリストにした方がいいかもしません。
72
106
 
73
107
 
74
108
 

1

Integer#prime_divisionを使うことに

2016/11/24 22:31

投稿

raccy
raccy

スコア21735

test CHANGED
@@ -82,7 +82,7 @@
82
82
 
83
83
  def divisors_all(m)
84
84
 
85
- [1].product(*Prime.prime_division(m).map { |n, e| (0..e).map { |i| n**i } })
85
+ [1].product(*m.prime_division.map { |n, e| (0..e).map { |i| n**i } })
86
86
 
87
87
  .map { |list| list.inject(:*) }
88
88