2017-07-04 10 views
0
class Triplet 
    def initialize(array,sum) 
     @array = array.sort() 
     @array_size = array.size() 
     @sum = sum 
     @result = [] 
    end 

    def get_triplet 
     @array[0..-3].each_with_index do |arr, ind| 
     pointer_one = ind + 1 
     pointer_two = @array_size - 1 
     while (pointer_one < pointer_two) 
      temp_sum = @array[pointer_one] + @array[pointer_two] + arr 
      if(temp_sum == @sum) 
      @result.push([@array[pointer_one], @array[pointer_two], arr]) 
      elsif temp_sum < @sum 
      pointer_one = pointer_one +1 
      else 
      pointer_two = pointer_two -1 
      end 
     end 
     end 
    end 

    def get_result 
     @result.each do |res| 
     puts res 
     end 
    end 
end 

puts "Enter the array of numbers" 
array = gets.chomp 
array = array.split(' ') 
array_integer = array.map{|a| a.to_i} 
puts array_integer 
puts "Enter the sum" 
sum = gets.chomp 
puts sum 
t1 = Triplet.new(array_integer,sum.to_i) 
t1.get_triplet 
t1.get_result 

誰も私に修正を提案して、無限にループしないようにすることができます。その和が@sumである配列内の三つ組を見つけるプログラムです。そのget_tripletメソッドのループ。 Initializeメソッドは配列、配列サイズを設定します。 get_tripletメソッドは、結果配列に合計が@sumである3つの数値をすべて格納する必要があります。Rubyコードを無限にループする

+1

いつも、 'temp_sum == @ sum'は、ポインタが一度もポインタも変更されないので、ループに巻き込まれてしまいます。したがって、pointer_oneは常にpointer_twoより小さくなり、常にtemp_sum == @sumが見つかるでしょう。 – RToyo

答えて

2

通常、このようなコードの絡みは正しいものではありません。この場合、問題の原因はcombinationメソッドでは分かりません。例えば

def triplet(list, target) 
    list.combination(3).find do |a,b,c| 
    a + b + c == target 
    end 
end 

:ここでは、機能的に同等なソリューションです

arr = [ 1, 2, 3, 4, 5, 6, 7, 8 ] 

p triplet(arr, 6) 
# => [1, 2, 3] 

p triplet(arr, 4) 
# => nil 

p triplet(arr, 10) 
# => [1, 2, 7] 

あなたのコード内で使用されるアルゴリズムは、問題に見える、あるいは少なくとも正しく実装し、またトリプレットに厳しく制限されています。このコードははるかに一般的で、実績のある、テストされたアルゴリズムを使用しているので、おそらくあなたの特定の問題を解決するのに適しています。