我如何解释 Ruby 中的伪代码?

How do I interpret this pseudocode in Ruby?

我不太明白如何 "initialize a multidimensional array to equal 1" 作为初始 for 循环似乎在这里建议。我还没有学会正确阅读伪代码,也不完全理解这个程序是如何工作的。

function countRoutes(m,n)
  grid ← array[m + 1][n + 1]

  for i = 0 to m do 
    grid[i][0] ← 1
  end for

  for j = 0 to n do 
    grid[0][j] ← 1
  end for

  for i = 1 to m do
    for j = 1 to n do
      grid[i][j] ← grid[i − 1][j] + grid[i][j − 1] 
    end for
  end for

  return grid[m][n] 
end function

感谢您的帮助!

符号 grid[i][j] ← something 表示将 something 分配给发生在第 i 行第 j 位置的 grid 的元素。所以这里的前两次循环建议把grid的第一列第一行的值(对应的是第一次和第二次循环)都设置为1。

这不难翻译.. Ruby用=代替左箭头赋值,用def代替function定义子程序(它调用方法而不是函数),仅此而已。让我们来看看吧。

function countRoutes(m,n)

这是函数定义的开始。在Ruby中我们使用一个方法来代替,定义这样一个东西的关键字是def。在 Ruby 中,使用 snake_case 代替驼峰式命名也是约定俗成的:

def count_routes(m, n)

现在创建网格:

grid ← array[m + 1][n + 1]

Ruby 数组是动态的,因此您通常不需要在创建时指定大小。但这也意味着您不会免费获得初始化或二维。那么我们这里要做的就是创建一个包含m+1个数组的数组,每个数组都可以为空(我们不需要指定子数组需要存放n+1个项)。 Ruby 的 Array 构造函数有一种方法可以做到这一点:

  grid = Array.new(m+1) do [] end

现在初始化。 Ruby 技术上有 for 循环,但没有人使用它们。相反,我们使用迭代器方法。对于计数循环,有一个整数方法叫做 times。但是伪代码从 0m 计算; times 也从 0 开始,但最多只比调用者少 一个 (这样当你调用 3.times 时,循环真的确实执行 "three times",而不是四)。在这种情况下,这意味着要获得伪代码的行为,我们需要在 m+1 上调用 times 而不是 m:

  (m+1).times do |i|
    grid[i][0] = 1
  end

顺便说一句,我们也可以在原始数组创建中完成那部分初始化:

  grid = Array.new(m+1) do [1] end

无论如何,第二个循环与第一个循环的工作方式相同,但与最初的创作合并起来会更尴尬。 Ruby 会愉快地扩展数组以分配给尚不存在的元素,因此我们没有初始化子数组这一事实不是问题:

  (n+1).times do |j|
    grid[0][j] = 1
  end

对于嵌套循环,伪代码不再从0开始计数,而是从1开始计数。从1到m与从0到m-1的循环次数相同,所以最简单的方法是让 times 使用其自然值,但在循环内的赋值语句中调整索引。也就是说,伪代码从 1 开始计数 i 并引用 i-1i,Ruby 代码从 0 开始计数 i 并引用 [=35] =] 和 i+1 代替。

  m.times do |i|
    n.times do |j| 
      grid[i+1][j+1] = grid[i][j+1] + grid[i+1][j] 
    end
  end

return 语句的工作原理相同,尽管在 Ruby 中您可以将其关闭:

  return grid[m][n]
end

将所有内容放在一起,您会得到:

def count_routes(m, n)
  grid = Array.new(m+1) do [1] end

  (n+1).times do |j|
    grid[0][j] = 1
  end

  m.times do |i|
    n.times do |j| 
      grid[i+1][j+1] = grid[i][j+1] + grid[i+1][j] 
    end
  end

  return grid[m][n]
end