我如何解释 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
。但是伪代码从 0
到 m
计算; 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-1
和 i
,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
我不太明白如何 "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
。但是伪代码从 0
到 m
计算; 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-1
和 i
,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