【发布时间】:2016-06-14 09:27:45
【问题描述】:
我发现了一个有趣的练习并尝试解决它。
它要求给定一个数字,它的数字应该以相反的顺序放在一个列表中。
现在,我几乎成功了:
lastDigit :: Integer -> Integer
lastDigit x = x `mod` 10
dropLastDigit :: Integer -> Integer
dropLastDigit x = (x - lastDigit x) `div` 10
numba2listInReverse :: Integer -> [Integer]
numba2listInReverse x = lastDigit x : numba2listInReverse (dropLastDigit x)
第一个函数只返回最后一个数字。第二个返回被剥夺了最后一位数字的数字。最后,最后一个函数生成列表。我的问题是我找不到 stop 递归的方法。查看输出:
Ok, modules loaded: Main.
*Main> dropLastDigit 123
12
*Main> numba2listInReverse 12345
[5,4,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0Interrupted.
*Main>
即使数字用完,它也会继续在列表中添加零。如何解决?
【问题讨论】:
-
测试
0以结束递归。numba2listInReverse 0 = []之类的东西(还没有测试过,但这是基本思想) -
解决此问题的另一种方法是使用
reverse $ show x。 -
我不得不提一下,有一个快速的单线涉及显示和反转,可以解决这个问题。另外,请注意您的输出是正确的,如果您认识到 1234 也可以写为 ..00001234。
-
dropLastDigit可以写成dropLastDigit = flip div 10,不需要减法。 -
感谢您的反馈,伙计们。现在,按顺序:1)我既不知道“显示”也不知道“反转”。但我会调查,听起来很有趣,谢谢!同样代表“翻转”。 2)如果我有一个像 0000123 这样的数字并且想把它全部放在列表中怎么办?检查零将排除初始零。