それはありません。どの出力から出力が生成されているのかを誤解しています。ここで
--------------------- # this is iteration 1
Word outside loop: ab # this is iteration 1
Word inside loop: ab # this is iteration 1
--------------------- # this is iteration 2
Word outside loop: b # this is iteration 2
Word inside loop: b # this is iteration 2
--------------------- # this is iteration 3
Word outside loop: # this is iteration 3
# Iteration 3 has NO FURTHER OUTPUT (because i is not less than word.length)
# we are returned to Iteration 2
# but... Iteration 2 ALSO has NO FURTHER OUTPUT (because i in that iteration, increased to 1, is not less than word length)
# we are returned to Iteration 1
Word inside loop: ab # this is the SECOND while loop in the first iteration, so yes, the word is "ab"
はあなたが何をしているの繰り返し見るために出力を変更するための簡単な方法です...最初の反復は、そのデフォルト
1
へ
iteration
の引数を持ち、次の反復をコールするたびにインクリメントされます。
def get_perm_recursive(prefix, word, perms, iteration=1)
puts "---------------------"
if word.length == 0
perms << prefix
end
i = 0
puts "Word outside loop: #{word} in iteration: #{iteration}"
while i < word.length
puts "Word inside loop: #{word} in iteration: #{iteration}""
prefix << word[i]
new_word = word[0...i] + word[i+1..-1]
get_perm_recursive(prefix, new_word, perms, iteration + 1)
i += 1
end
end
ちなみに... get_perms
はパーマ(permutations?)の配列を返すと思われます。しかし、あなたは順列呼び出しの中で計算されたperms
を返す仕組みがありません。各メソッドがperms
を返すようにし、返されたperms
を変数に代入する必要があります。
変更第1の方法と...
def get_perms(word)
perms = []
perms = get_perm_recursive("",word, perms)
perms
end
... get_perm_recursiveの結果を変数に代入、またはさらに良くなるように、ちょうど最後の実行文としてget_perm_recursiveを持っています。
def get_perms(word)
get_perm_recursive("",word, [])
end
あなたはまた、トラップにget_perm_recursive
WITHIN get_perm_recursive
の出力が必要なので、置き換え、
perms = perms + get_perm_recursive(prefix, new_word, perms)
と
get_perm_recursive(prefix, new_word, perms)
そしてget_perm_recursive
方法の非常に最後の文が返す必要がありますperms
アレイ...
i += 1
end
perms
end
私が言及したいもう一つは、構造
i = 0
while i < limiting_value
...
i += 1
end
...ルビー風をされていません。より典型的でより良い実装は、
(0...limiting_value) do |i|
...
end
ようこそ!あなたが本当にここで何をしようとしているのか分かりません。ループはスコープゲートではなく、#get_perm_recursiveを呼び出すたびに* word *(したがってループ条件)のサイズを変更しています。実際の目標が何であっても表現するには、おそらくより良い方法があります。予想される結果(問題のコードだけでなく)で質問を更新することは大きな助けになります。 –