我如何在Ruby中解释这个伪代码?

时间:2017-01-02 22:36:38

标签: ruby pseudocode

我不太明白如何将多维数组初始化为等于1"因为循环的初始似乎在这里建议。我还没有学会正确阅读伪代码,我也不完全理解这个程序是如何工作的。

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

这并不难翻译.Ruby使用=代替左箭头进行分配,使用def代替function来定义子程序(它称之为方法而不是功能),但是关于它。我们来看看吧。

function countRoutes(m,n)

开始一个功能定义。在Ruby中,我们使用方法,而定义这样的东西的关键字是def。在Ruby中也使用snake_case代替camelCase来使用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时,循环确实会执行& #34;三次",而不是四次)。在这种情况下,这意味着要获得伪代码的行为,我们需要在times而不是m+1上调用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计数的循环迭代次数相同,因此最简单的方法是让{ {1}}使用其自然值,但调整循环内赋值语句中的索引。也就是说,伪代码从1开始计数times并引用ii-1,Ruby代码从0开始计算i并引用i和{ {1}}而不是。

i

i+1语句也是一样的,尽管在Ruby中你可以把它关掉:

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

总而言之,你得到了这个:

return

答案 1 :(得分:0)

符号grid[i][j] ← something表示将something分配给grid - i - j位置的RewriteCond元素。所以前两个循环建议将第一列的所有值和网格的第一行(相应地,第一个和第二个循环)设置为1.