Ruby代码无限循环

时间:2017-07-04 14:15:44

标签: ruby

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的所有三个数字。

1 个答案:

答案 0 :(得分: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]

您的代码中使用的算法看起来有问题,或至少实现不正确,并且也严格限于三元组。此代码更通用,并使用经过验证的经过测试的算法,因此它可能更适合解决您的特定问题。