首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带尾递归运行的矩阵转置

带尾递归运行的矩阵转置
EN

Stack Overflow用户
提问于 2015-10-06 01:57:46
回答 1查看 229关注 0票数 3

我正在用矩阵转置来处理转置,但这要永远运行。我在这里做错什么了?

代码语言:javascript
复制
transpose'' :: [[Int]] -> [[Int]] -> [[Int]]
transpose'' [] acc = acc
transpose'' m acc = transpose'' (map tail m) (acc ++ [map head m])

transpose' m = transpose'' m []

现在我已经检查了空子列表,但是有更优雅的方法吗?

代码语言:javascript
复制
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 []
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-06 02:07:21

在本条款中:

代码语言:javascript
复制
transpose'' m acc = transpose'' (map tail m) (acc ++ [map head m])

我们知道如果我们达到这个条款,那么m /= []。请注意,map tail m的长度与m相同,因此无论m是什么,都不能是[]。因此,递归不能终止。

为了处理这个问题,您有两个选项:一个是删除空子列表,另一个是使用第一个子句检查所有子列表是否为空,而不是检查列表本身是否为空。在这两种情况下,您可能都需要更优雅地接受带有空子列表的列表;tailhead是调用空列表的糟糕函数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32960539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档