Ruby:创建一个对角线带为1,2,1的矩阵



在我们开始之前,请理解我是ruby和计算机编程的初学者,我没有先验知识,需要编程是最基本的基础,否则我无法理解。我现在正在做一个学校的项目,被卡住了。

我必须为矩阵a创建一个ruby代码,该矩阵a有n行n列,其值为[2,1]

[2,1,0,0,0]
[1,2,1,0,0]
[0,1,2,1,0]
[0,0,1,2,1]

我做了一个代码,但不知道为什么它是错误的,在哪里…请帮助! !

def make1d(n)
  a = Array.new(n)
   for i in 0..(n-1)
    a[i] = 0
  end
  a
end
def make2d(height,width)
  a = Array.new(height)
  for i in 0..(height-1)
    a[i] = make1d(width)
  end
  a
end
def matrixa(n)
 a=make2d(n,n)
  for k in 0..n-2
  a[k][k]=2
  a[k+1][k]=1
  a[k][k+1]=1
  a[n-1][n-1]=2
  end
 a
end

Ruby有一些很好的特性可以利用。例如,Array.new使用一个块(do ... end)来指定一个默认值。这个块获取当前索引作为参数(do |index| ... end)。非常适合这个场景!

你的逻辑似乎很复杂,只是在对角线上设置值。如果你后退一步,如果你只看行和列下标,对角线有什么特别之处?对,它们是相等的。如果你向右/左移动一个对角线,那么所有的row和col索引都将差一个,以此类推。

我是这样写代码的:

Array.new(n) do |row|
  Array.new(n) do |col|
    case row - col
    when -1 then 1
    when 0 then 2
    when 1 then 1
    else 0
    end
  end
end

或者你可以让它更短,也处理一般情况。只需将2替换为您想要的值,或将其作为函数参数

Array.new(n) do |row|
  Array.new(n) do |col|
    [2 - (row - col).abs, 0].max
  end
end

最新更新