user2445971
user2445971

Reputation: 87

Unexpected $end , expecting kEND

My task is to make a more efficient binary search code using Ruby. I followed the logic from this link: http://www.cprogramming.com/discussionarticles/sorting_and_searching.html

My code is as follows:

def bsearch(a, k)

  lower = 0
  upper = a.length-1

  while a[upper].to_f> k.to_f and a[lower].to_f< k.to_f
    low_diff = k.to_f -a[lower].to_f
    range_diff = a[upper].to_f-a[lower].to_f
    count_diff = upper-lower
    range = low_diff/range_diff * count_diff  + lower

    if k==a[lower]
      return lower

    if k.to_f > a[range].to_f
      lower = range+1
    else if k.to_f <  a[range].to_f
      upper =range
    else    
      lower = range
    end

  end
end

I double check, but I do not know why I keep experiencing the followin error:

unexpected $end , expecting kEND

Upvotes: 2

Views: 4179

Answers (2)

Aditya Kamatar
Aditya Kamatar

Reputation: 363

You cannot write else if in ruby you should write elsif

  def bsearch(a, k)

  lower = 0
  upper = a.length-1

  while a[upper].to_f> k.to_f && a[lower].to_f< k.to_f
    low_diff = k.to_f -a[lower].to_f
    range_diff = a[upper].to_f-a[lower].to_f
    count_diff = upper-lower
    range = low_diff/range_diff * count_diff  + lower
    if k==a[lower]
      return lower
    end
    if k.to_f > a[range].to_f
      lower = range+1
    elsif k.to_f <  a[range].to_f
      upper =range
    else    
      lower = range
    end 
  end
end

Upvotes: 1

Yu Hao
Yu Hao

Reputation: 122383

You lost an end in one of the if statement. And instead of else if, the keyword in Ruby is elsif

if k==a[lower]
    return lower
end                             #lost this end
if k.to_f > a[range].to_f
    lower = range+1
elsif k.to_f <  a[range].to_f   #use elsif
    upper =range
else    
    lower = range
end 

Upvotes: 7

Related Questions