我正在用矩阵转置来处理转置,但这要永远运行。我在这里做错什么了?
transpose'' :: [[Int]] -> [[Int]] -> [[Int]]
transpose'' [] acc = acc
transpose'' m acc = transpose'' (map tail m) (acc ++ [map head m])
transpose' m = transpose'' m []现在我已经检查了空子列表,但是有更优雅的方法吗?
transpose' :: [[Int]] -> [[Int]]
check m
|head m == [] = []
|otherwise = m
transpose'' [] acc = acc
transpose'' m acc = transpose'' (check (map tail m)) (acc ++ [map head m])
transpose' m = transpose'' m []发布于 2015-10-06 02:07:21
在本条款中:
transpose'' m acc = transpose'' (map tail m) (acc ++ [map head m])我们知道如果我们达到这个条款,那么m /= []。请注意,map tail m的长度与m相同,因此无论m是什么,都不能是[]。因此,递归不能终止。
为了处理这个问题,您有两个选项:一个是删除空子列表,另一个是使用第一个子句检查所有子列表是否为空,而不是检查列表本身是否为空。在这两种情况下,您可能都需要更优雅地接受带有空子列表的列表;tail和head是调用空列表的糟糕函数。
https://stackoverflow.com/questions/32960539
复制相似问题