回答編集履歴
2
第二の選択を追加
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を使うことに
test
CHANGED
@@ -82,7 +82,7 @@
|
|
82
82
|
|
83
83
|
def divisors_all(m)
|
84
84
|
|
85
|
-
[1].product(*
|
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
|
|