我很难想出一种函数式方法来反转 Ruby 中的多维(偶数维)数组。 输入:[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 输出:[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
此迭代解决方案有效。
def reverse(arr)
size = arr.length
output = Array.new(size) { Array.new(size,0) }
arr.reverse.each_with_index do |a, i|
a.each_with_index do |a, j|
output[j][i] = a
end
end
output
end
有人知道如何在不引用显式索引的情况下使用更多的函数式编程风格吗?
最佳答案
如果 array
是你的输入,那么它就很简单
result = array.transpose.map(&:reverse)
如果我正确理解您想要的输出。 ;)
详细说明一下:Array#transpose
基本上沿主对角线“镜像”二维数组:
transposed = array.transpose #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
您似乎只希望所有行都反转,这是通过调用 map
处理的:
result = transposed.map(&:reverse) #=> [[7, 4, 1], [8, 5, 2], [9, 6, 3]]
map(&:reverse)
语法只是map { |a| 的简写a.reverse
并由 this 启用方法。
手工制作
在我最初的回答之后,在评论中发现 OP 实际上是在 transpose
的功能实现之后。这是我想出的:
def transpose(a)
(0...a[0].length).map { |i|
(0...a.length).map { |j| a[j][i] }
}
end
虽然这确实引用了显式索引,但它是由其他纯函数组成的纯函数,因此它至少符合我对泛函的定义。 ;)
关于arrays - 反转多维数组 - 函数式编程风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38512908/