Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在网格上查找匹配行的递归方法_Ruby_Recursion - Fatal编程技术网

Ruby 在网格上查找匹配行的递归方法

Ruby 在网格上查找匹配行的递归方法,ruby,recursion,Ruby,Recursion,我有一个网格对象,由空间对象填充,每个对象都包含一个值。我要做的是写一个方法,它取一个空格,一个表示我想要找到的相等空格数量的数字,看看网格上是否有x个相等空格在同一方向 在psuedo代码中,我计划的步骤是: 从网格的左上角开始 检查每个方向(N、S、E、W、NE、NW、SE、SW)有无2种情况 那个方向的空间是存在的 该空间中的值与当前空间中的值匹配 如果这些条件都失败了,我想再次调用该方法,但将当前空间作为下一个空间(增加左>>右>>上>>下) 如果满足这些条件,我希望将该值存储在一个列

我有一个网格对象,由空间对象填充,每个对象都包含一个值。我要做的是写一个方法,它取一个空格,一个表示我想要找到的相等空格数量的数字,看看网格上是否有x个相等空格在同一方向

在psuedo代码中,我计划的步骤是:

  • 从网格的左上角开始
  • 检查每个方向(N、S、E、W、NE、NW、SE、SW)有无2种情况
  • 那个方向的空间是存在的
  • 该空间中的值与当前空间中的值匹配
  • 如果这些条件都失败了,我想再次调用该方法,但将当前空间作为下一个空间(增加左>>右>>上>>下)
  • 如果满足这些条件,我希望将该值存储在一个列表中,然后再次调用该方法,仅在找到当前空间的方向上检查匹配空间
  • 如果下一个空格发现其相邻空格不匹配,我希望
  • 停止搜索
  • 返回调用该方法的第一个空格
  • 检查其余方向以满足2个条件
  • 如果没有空格满足,则使用下一个空格再次调用该方法(增加left>>right&top>>bottom)
  • 当当前空格为右下角空格或匹配值列表的长度与指定的值相同时,函数返回
  • 如果这是在下面的tic-tac趾板上实现的,我会从左上角的“O”开始。我会检查北部,不合格,检查东北部,不合格,检查东部,通过。一旦它通过,我会移动到下一个“O”,只检查它的东面,因为当前的“O”是在它之前空间的东面发现的,这将给我找到3个“O”的预期结果。 我想处理的另一种情况是,如果选中东南方向,空间将移动到中心,中心空间将检查其东南方向,注意“X”不等于“O”,返回左上角的空间,检查其余方向,然后移动到该行的下一个空格并重复,直到选中所有空格或找到匹配项

    我对该方法的非递归实现如下所示。它在每个空间中循环,对于每个空间,它在每个指南针方向上循环,并将重复“num”次的值赋给找到的变量,如果没有找到,该变量将返回nil,或者将重复“num”次的值赋给找到的变量

    def check_for_row_of(num)
        found = nil
        each_space do |space|
            COMPASS.each do |direction|
                if num_spaces_in_direction(space.pos, direction) == num
                    values = get_spaces_by_pattern(space.pos, direction)
                    found = values.uniq[0] if values.uniq.length == 1 && values.uniq[0] != " "
                end
            end
        end
        found
    end
    

    如果我理解正确,我相信下面的代码回答了您的问题。请告诉我这是否和你想的不太一样

    为了便于阅读,我将递归
    search
    函数与遍历每个单元格和方向的(有些笨拙)逻辑分开

    另外,值得一提的是,我正在对数组数组调用
    转置
    反转
    ,以便人们更容易阅读网格。左下角是(0,0),右上角是(2,2)


    如果你提供一个小例子,包括期望的结果,你会产生更多的兴趣。谢谢你,我接受了你的建议
    def search(grid, x, y, direction, length_to_find, value_to_find=nil)
      return true if length_to_find == 0
    
      value_at_location = grid.transpose[x].reverse[y] if grid.transpose[x]
      value_to_find ||= value_at_location
      return false if value_at_location != value_to_find
    
      y += 1 if direction =~ /N/i
      y -= 1 if direction =~ /S/i
      x += 1 if direction =~ /E/i
      x -= 1 if direction =~ /W/i
      search(grid, x, y, direction, length_to_find - 1, value_to_find)
    end
    
    def row_of?(grid, length_to_find)
      grid.length.times do |row|
        grid[0].length.times do |col|
          %w[N NE E SE S SW W NW].each do |direction|
            if search(grid, row, col, direction, length_to_find)
              return true
            end
          end
        end
      end
      false
    end
    
    grid = [
      [ "O", "O", "O"],
      [ " ", "O", "X"],
      [ " ", "X", "X"]
    ]
    
    puts row_of?(grid, 3)