teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

12

コードの修正を行う。

2015/05/05 12:19

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -12,7 +12,7 @@
12
12
  cnt = 0
13
13
  (0..N).each{|a|
14
14
  (0..a).each{|b|
15
- cnt += c(a, b)
15
+ cnt += ncr(a, b)
16
16
  }
17
17
  }
18
18
  p cnt == 2 ** (N + 1) - 1

11

関数をncrに統一する。

2015/05/05 12:19

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -1,11 +1,11 @@
1
1
  以下の**工夫なし**のコードでは、コンビネーションの計算をするのに
2
2
  1分以上かかっています。
3
3
  ```lang-ruby
4
- def c(m, n)
4
+ def ncr(n, r)
5
- n = m - n if n > m - n
5
+ r = n - r if r > n - r
6
- return 0 if n < 0
6
+ return 0 if r < 0
7
- return 1 if n == 0
7
+ return 1 if r == 0
8
- return (m - n + 1..m).inject(:*) / (1..n).inject(:*)
8
+ return (n - r + 1..n).inject(:*) / (1..r).inject(:*)
9
9
  end
10
10
 
11
11
  N = 1000
@@ -19,22 +19,8 @@
19
19
  ```
20
20
  大きな数字でもコンビネーションの計算を
21
21
  速く求められるようにするには
22
- 以下をどのようにめればよろしいでしょうか?
22
+ ncr をどのようにめればよろしいでしょうか?
23
- ```lang-ruby
24
- def c(m, n)
25
- ???
26
- end
27
23
 
28
- N = 1000
29
- cnt = 0
30
- (0..N).each{|a|
31
- (0..a).each{|b|
32
- cnt += c(a, b)
33
- }
34
- }
35
- p cnt == 2 ** (N + 1) - 1
36
- ```
37
-
38
24
  (追記)
39
25
  ちなみに、Python版(**工夫なし**)では同じ計算を1分以内で行います。
40
26
  ```lang-Python

10

コードの修正を行う。

2015/05/05 11:51

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- 以下の工夫なしのコードでは、コンビネーションの計算をするのに
1
+ 以下の**工夫なし**のコードでは、コンビネーションの計算をするのに
2
2
  1分以上かかっています。
3
3
  ```lang-ruby
4
4
  def c(m, n)
@@ -15,7 +15,6 @@
15
15
  cnt += c(a, b)
16
16
  }
17
17
  }
18
- # trueと出力されるはず
19
18
  p cnt == 2 ** (N + 1) - 1
20
19
  ```
21
20
  大きな数字でもコンビネーションの計算を
@@ -33,12 +32,11 @@
33
32
  cnt += c(a, b)
34
33
  }
35
34
  }
36
- # trueと出力されるはず
37
35
  p cnt == 2 ** (N + 1) - 1
38
36
  ```
39
37
 
40
38
  (追記)
41
- ちなみに、Python版(工夫なし)では同じ計算を1分以内で行います。
39
+ ちなみに、Python版(**工夫なし**)では同じ計算を1分以内で行います。
42
40
  ```lang-Python
43
41
  from math import factorial
44
42
 

9

文を追加しました。

2015/05/05 11:36

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,5 @@
1
- 以下のコンビネーションの計算をするのに1分以上かかっています。
1
+ 以下の工夫なしのードでは、コンビネーションの計算をするのに
2
+ 1分以上かかっています。
2
3
  ```lang-ruby
3
4
  def c(m, n)
4
5
  n = m - n if n > m - n

8

追記を追加しました。

2015/05/05 11:24

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -17,11 +17,9 @@
17
17
  # trueと出力されるはず
18
18
  p cnt == 2 ** (N + 1) - 1
19
19
  ```
20
-
21
20
  大きな数字でもコンビネーションの計算を
22
21
  速く求められるようにするには
23
22
  以下をどのように埋めればよろしいでしょうか?
24
-
25
23
  ```lang-ruby
26
24
  def c(m, n)
27
25
  ???
@@ -38,6 +36,7 @@
38
36
  p cnt == 2 ** (N + 1) - 1
39
37
  ```
40
38
 
39
+ (追記)
41
40
  ちなみに、Python版(工夫なし)では同じ計算を1分以内で行います。
42
41
  ```lang-Python
43
42
  from math import factorial

7

Python版を追加。

2015/05/04 18:35

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -36,4 +36,31 @@
36
36
  }
37
37
  # trueと出力されるはず
38
38
  p cnt == 2 ** (N + 1) - 1
39
+ ```
40
+
41
+ ちなみに、Python版(工夫なし)では同じ計算を1分以内で行います。
42
+ ```lang-Python
43
+ from math import factorial
44
+
45
+ def product(iterable):
46
+ prod = 1
47
+ for n in iterable:
48
+ prod *= n
49
+ return prod
50
+
51
+ def npr(n, r):
52
+ return product(range(n - r + 1, n + 1))
53
+
54
+ def ncr(n, r):
55
+ if r > n // 2:
56
+ r = n - r
57
+ return npr(n, r) // factorial(r)
58
+
59
+ N = 1000
60
+ cnt = 0
61
+ for a in xrange(N + 1):
62
+ for b in xrange(a + 1):
63
+ cnt += ncr(a, b)
64
+
65
+ print cnt == 2 ** (N + 1) - 1
39
66
  ```

6

コードをスッキリさせた。

2015/05/04 18:32

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -1,11 +1,9 @@
1
1
  以下のコンビネーションの計算をするのに1分以上かかっています。
2
2
  ```lang-ruby
3
3
  def c(m, n)
4
- return 1 if m == n
5
- return 0 if m < n
4
+ n = m - n if n > m - n
6
5
  return 0 if n < 0
7
6
  return 1 if n == 0
8
- n = m - n if n > m - n
9
7
  return (m - n + 1..m).inject(:*) / (1..n).inject(:*)
10
8
  end
11
9
 

5

コードの修正を行う。

2015/05/04 15:37

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -5,11 +5,8 @@
5
5
  return 0 if m < n
6
6
  return 0 if n < 0
7
7
  return 1 if n == 0
8
- if n <= m - n
8
+ n = m - n if n > m - n
9
- return (m - n + 1..m).inject(:*) / (1..n).inject(:*)
9
+ return (m - n + 1..m).inject(:*) / (1..n).inject(:*)
10
- else
11
- return (n + 1..m).inject(:*) / (1..m - n).inject(:*)
12
- end
13
10
  end
14
11
 
15
12
  N = 1000

4

どこを埋めるか分かりやすくしました。

2015/05/04 14:44

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -29,7 +29,7 @@
29
29
 
30
30
  ```lang-ruby
31
31
  def c(m, n)
32
-
32
+ ???
33
33
  end
34
34
 
35
35
  N = 1000

3

遅いコードも追加。

2015/05/04 05:28

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,28 @@
1
+ 以下のコンビネーションの計算をするのに1分以上かかっています。
2
+ ```lang-ruby
3
+ def c(m, n)
4
+ return 1 if m == n
5
+ return 0 if m < n
6
+ return 0 if n < 0
7
+ return 1 if n == 0
8
+ if n <= m - n
9
+ return (m - n + 1..m).inject(:*) / (1..n).inject(:*)
10
+ else
11
+ return (n + 1..m).inject(:*) / (1..m - n).inject(:*)
12
+ end
13
+ end
14
+
15
+ N = 1000
16
+ cnt = 0
17
+ (0..N).each{|a|
18
+ (0..a).each{|b|
19
+ cnt += c(a, b)
20
+ }
21
+ }
22
+ # trueと出力されるはず
23
+ p cnt == 2 ** (N + 1) - 1
24
+ ```
25
+
1
26
  大きな数字でもコンビネーションの計算を
2
27
  速く求められるようにするには
3
28
  以下をどのように埋めればよろしいでしょうか?
@@ -6,8 +31,14 @@
6
31
  def c(m, n)
7
32
 
8
33
  end
9
- # 100C50を計算
34
+
10
- p c(100, 50)
35
+ N = 1000
36
+ cnt = 0
37
+ (0..N).each{|a|
38
+ (0..a).each{|b|
39
+ cnt += c(a, b)
40
+ }
41
+ }
42
+ # trueと出力されるはず
43
+ p cnt == 2 ** (N + 1) - 1
11
- ```
44
+ ```
12
- 注意)
13
- nC0 = 1 とか求められるようにしてください。

2

小文字でないと動かない?

2015/05/04 05:26

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
@@ -3,11 +3,11 @@
3
3
  以下をどのように埋めればよろしいでしょうか?
4
4
 
5
5
  ```lang-ruby
6
- def C(m, n)
6
+ def c(m, n)
7
7
 
8
8
  end
9
9
  # 100C50を計算
10
- p C(100, 50)
10
+ p c(100, 50)
11
11
  ```
12
12
  注意)
13
13
  nC0 = 1 とか求められるようにしてください。

1

初心者マーク追加。

2015/05/03 08:19

投稿

manman
manman

スコア233

title CHANGED
File without changes
body CHANGED
File without changes