反转列表时出现意外的结果 [英] Unexpected result while reversing a list

查看:92
本文介绍了反转列表时出现意外的结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  reverse':

我需要对下面代码的意外结果进行一些解释,看起来是由于一些错误。 :[b] - > [b]
reverse'[] = []
reverse'[x] = [x]
reverse'(x:xs)= last(x:xs):reverse'xs

*主要>反向'[0,8,2,5,6,1,20,99,91,1]
[1,1,1,1,1,1,1,1,1,1]

这是因为一些错误吗?

解决方案

当你得到一个完全意想不到的结果,特别是像这样相对简单的函数时,手动操作逻辑会很有帮助。所以让我们看看这里发生了什么:

  reverse'(0:[8,2,5,6,1,20,99 ,91,1])= 1:reverse'xs ==> 
1:(reverse'(8:[2,5,6,1,20,99,91,1])= 1:reverse'xs ==>
1:1:(reverse '(2:[5,6,1,20,99,91,1])= 1:反向'xs ==>
...

你可以看到这是怎么回事,问题很简单,你只是在递归步骤中颠倒了列表的错误部分,而不是倒转尾部就像你现在所做的那样,除了最后一个元素之外,你想要改变所有的东西,所以你可以修改它为这样:

  reverse':: [b]  - > [b] 
reverse'[] = []
reverse'[x] = [x]
reverse'xs = last xs:reverse '(init xs)

它返回你期望的结果: reverse' [1,91,99,20,1,6,5,2,8,0] = [0,8,2,5,6,1,20,99,91,1]

I need some explanation into the unexpected result of the code below, seemingly, due to some bug.

reverse' :: [b] -> [b]
reverse' [] = []
reverse' [x] = [x]
reverse'(x:xs) = last (x:xs) : reverse' xs

*Main> reverse' [0,8,2,5,6,1,20,99,91,1]
[1,1,1,1,1,1,1,1,1,1]

Is this because of some bug?

解决方案

When you get a totally unexpected result, especially with relatively simple function like this, it can be helpful to follow the logic through by hand. So let's see what happens here:

reverse' (0:[8,2,5,6,1,20,99,91,1]) = 1 : reverse' xs ==>
1 : (reverse' (8:[2,5,6,1,20,99,91,1]) = 1 : reverse' xs ==>
1 : 1 : (reverse' (2:[5,6,1,20,99,91,1]) = 1 : reverse' xs ==>
...

You can see where this is going. The problem is simple; you're just reversing the wrong part of the list in the recursive step. Instead of reversing the tail like you're doing now, you want to reverse everything but the last element. So you could revise it to something like this:

reverse' :: [b] -> [b]
reverse' [] = []
reverse' [x] = [x]
reverse' xs = last xs : reverse' (init xs)

which returns what you'd expect: reverse' [1,91,99,20,1,6,5,2,8,0] = [0,8,2,5,6,1,20,99,91,1]

这篇关于反转列表时出现意外的结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆