首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我的bsearch版本不能工作?

为什么我的bsearch版本不能工作?
EN

Stack Overflow用户
提问于 2015-04-26 10:59:54
回答 2查看 68关注 0票数 0

我正在运行bsearch([1,2,3,4,5,6], 6)

这是我的bsearch版本:

代码语言:javascript
复制
def bsearch(arr, target)

    return nil if arr.size == 0

    half = arr.size / 2
    left = arr[0...half]
    right = arr[half...-1]

    case target <=> arr[half]
    when 1
      return half + bsearch(right, target)
    when 0
      return half
    when -1
      return bsearch(left, target)
    end
end

这是我被抛出的错误:

代码语言:javascript
复制
recursion.rb:224:in `+': nil can't be coerced into Fixnum (TypeError)
    from recursion.rb:224:in `bsearch'
    from recursion.rb:224:in `bsearch'
    from recursion.rb:249:in `<main>'
EN

回答 2

Stack Overflow用户

发布于 2015-04-26 11:16:15

来自ruby docs

..从头到尾都要包括在内。它们是使用...排除结束值

您的代码排除了最后的数组元素。

代码语言:javascript
复制
left = arr[0...half]
right = arr[half...-1]

更改为对..而不是...使用范围运算符

代码语言:javascript
复制
left = arr[0..half]
right = arr[half..-1]
票数 1
EN

Stack Overflow用户

发布于 2015-04-26 11:47:24

你应该添加一些调试代码,它可以帮助你节省很多时间,并找到根本原因。

代码语言:javascript
复制
def bsearch(arr, target)

    return nil if arr.size == 0

    half = arr.size / 2
    puts "half: #{half}"
    left = arr[0...half]
    puts "left:#{left}"
    puts "arr:#{arr}"
    right = arr[half...-1]
    puts "right:#{right}"
    ....
end

结果:

代码语言:javascript
复制
left:[1, 2, 3]
arr:[1, 2, 3, 4, 5, 6]
half:3
right:[4, 5]
left:[4]
arr:[4, 5]
half:1
right:[]
test.rb:16:in `+': nil can't be coerced into Fixnum (TypeError)
    from test.rb:16:in `bsearch'
    from test.rb:16:in `bsearch'
    from test.rb:24:in `<main>'

然后你会发现一些问题。

  1. right :4,5 => it it be 4,5,6
  2. arr = 4,5;half = 1;=> right= arr1...-1 = []

因此bsearch(right, target)将返回nil

你的代码应该是:

代码语言:javascript
复制
left = arr[0..half]
right = arr[half..-1]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29873209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档