我不太明白如何将多维数组初始化为等于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
感谢您的帮助!
答案 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
的整数方法。但伪代码从0
到m
包括在内; 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
并引用i
和i-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.