1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
というように両端に1を置き、左上と右上との数を足すという規則で数を配置したときに、段を指定するとその段の数字を表示するようなシステムをつくりたいです。
例えば4と入力したら「1 3 3 1」出力されるというイメージです。
どうすれば出来るでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
jun68ykt さんの回答の
(i > 0 ? prev[i-1] : 0) + ( i < prev.length ? prev[i] : 0)
の部分をもうすこし単純に書けないかを考えてみました。
つぎのように考えました。
[0, 前の段...]
[姉の段, ... 0]
の配列の要素ごとの和を計算することにする。
さらに、和をとる配列は 他方を reverse すれば得られることも考慮しました。
rrr.rb
ruby
1def base_of_pascals_triangle(n) 2 return [1] if n == 1 3 4 prev = [0] + base_of_pascals_triangle(n - 1) 5 prev.zip(prev.reverse).map(&:sum) 6end 7 8(1..10).each do |x| 9 puts base_of_pascals_triangle(x).to_s 10end
追記:
結果の配列が左右対称であることを考慮すれば、計算は 約 1/2 に減らすことができますが、
h が空数か奇数かで処理分岐をすることでコードが長くなってしまう気がしたので、
そのことは取り込んでいません。
追記
数列が左右対称であることをして、足し算の回数を約按分にしてみました。
ruby
1def base_of_pascals_triangle(n) 2 return [1] if n == 1 3 4 prev = [0] + base_of_pascals_triangle(n - 1) 5 left = (0..((n - 1) / 2)).map { |x| prev[x] + prev[x + 1] } 6 left + left[0...(n / 2)].reverse 7end
投稿2018/03/25 11:54
編集2018/03/26 15:50総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
上の段から順に、そのまま算出すればよいです。
Python
でのコード例です。このままだと100段くらいだとかなり時間かかりますが。
お手軽にlru_cache
を使ってメモ化してみました。100段でも瞬時に求まります。
Python
1from functools import lru_cache 2 3@lru_cache(maxsize=1000) # サイズは適当に 4def val( row, col): 5 if col <= 0 or col >= row: 6 return 1 7 return val( row-1, col-1) + val(row-1,col) 8 9with open('ret.txt','w') as f: # 見づらいのでファイルに出力 10 for row in range(100): 11 for col in range(row+1): 12 f.write('{:40d}'.format( val( row, col))) # 40桁で足りる 13 f.write('\n')
投稿2018/03/24 11:30
編集2018/03/24 11:53総合スコア38262
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参考情報
- 続・パスカルの三角形
http://gamescripting.hatenablog.jp/entry/20060530/1149000099
ruby
1k = 6 2(1..k).inject([1]) { |a, dummy| ([0] + a).zip(a).map { |x, y| y ? x + y : x} } 3=> [1, 5, 10, 10, 5, 1] 4 5k = 10 6(1..k).inject([1]) { |a, dummy| ([0] + a).zip(a).map { |x, y| y ? x + y : x} } 7=> [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
投稿2018/03/24 23:31
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
再帰を使ってやってみました。
(※以下のコードで、メソッド名 base_of_pascals_triangle
は、「パスカルの三角形の底辺」の意)
[ykt68@macbook15]$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin17]
[ykt68@macbook15]$ cat tera118837.rb
ruby
1def base_of_pascals_triangle(n) 2 if n == 1 3 [1] 4 else 5 prev = base_of_pascals_triangle(n-1) 6 (0...n).map do |i| 7 (i > 0 ? prev[i-1] : 0) + ( i < prev.length ? prev[i] : 0) 8 end 9 end 10end 11 12puts "#{base_of_pascals_triangle(6)}"
[ykt68@macbook15]$ ruby tera118837.rb
[1, 5, 10, 10, 5, 1]
[ykt68@macbook15]$
投稿2018/03/24 11:41
編集2018/03/25 01:47総合スコア9058
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。