From: Shin-ichiro HARA Date: 2000-12-13T14:46:16+09:00 Subject: [ruby-list:26519] Re: n-fold loop 原です。 >児玉 です. > > 佐藤と申します. > > やりたいことは,nが与えられたときに(仮にn=3とする), > > 例えば用意された配列 [A, B, C, D] に対して, > > [A, A, A] >.... > > の様な順列を得たいのです.(4Pn) >... > >再帰的な呼び出しをかけたら? > >def p(arr,res,n) >if n==0 then print res,"\n"; >else > for i in arr > p(arr,res+[i],n-1) > end >end >end > >print p(["a","b","c","d"],[],3) ほとんど同じなんですけど、こんな風にするとかっこいいでしょう。 def power(n, m = n) if m == 0 yield([]) else power(n, m - 1) do |x| (0...n).each do |i| yield([i] + x) end end end end power(4, 3) do |x| p ["a", "b", "c", "d"].indexes(*x) end 「Rubyプログラミング入門」の「8.3順列組み合わせライブラリ」に 載ってました。(と一読者のふり。)