我如何计算 iterations/steps 的数量以找到方法的答案 - RUBY

How can I count number of iterations/steps to find answers of a method - RUBY

如何获得此方法找到答案所需的 iterations/steps 次数?

def binary_search(array, n)
 min = 0
 max = (array.length) - 1

 while min <= max
     middle = (min + max) / 2

    if array[middle] == n
          return middle
     elsif array[middle] > n
         max = middle - 1
     elsif array[middle] < n
       min = middle + 1
     end 
     end 
    "#{n} not found in this array"
 end 

只需计算迭代次数即可。

  • 在循环外将变量设置为 0
  • 在循环里面给它加1
  • 当您 return 索引时,return 计数 (return [middle, count])。

可以代替计数器使用的一个选项是 .with_index 关键字。要使用它,您需要使用 loop 而不是 while,但它应该是一样的。这是一个带输出的基本示例。

arr = [1,2,3,4,5,6,7,8]
loop.with_index do |_, index| # The underscore is to ignore the first variable as it's not used
  if (arr[index] % 2).zero?
    puts "even: #{arr[index]}"
  else
    puts "odd: #{arr[index]}"
  end

  break if index.eql?(arr.length - 1)
end

=>
odd: 1
even: 2
odd: 3
even: 4
odd: 5
even: 6
odd: 7
even: 8

我假设计算 binary_search 所需的交互次数的代码将用于测试或优化。如果是这样,方法 binary_search 应该修改为生成生产代码,只需要删除(或注释掉)代码行,而不是修改语句。这是一种可行的方法。

def binary_search(array, n)
  # remove from production code lines marked ->              #******
  _bin_srch_iters = 0                                        #******
  begin                                                      #******
    min = 0
    max = (array.length) - 1
    loop do
      _bin_srch_iters += 1                                   #******
      middle = (min + max) / 2
      break middle if array[middle] == n
      break nil if min == max  
      if array[middle] > n
        max = middle - 1
      else # array[middle] < n
        min = middle + 1
      end 
    end
  ensure                                                     #****** 
    puts "binary_search reqd #{_bin_srch_iters} interations" #******  
  end                                                        #******
end
x = binary_search([1,3,6,7,9,11], 3)
#   binary_search reqd 3 interations
#=> 1 
binary_search([1,3,6,7,9,11], 5) 
#   binary_search reqd 3 interations
#=> nil