我希望有人可以帮助找出我的错误所在。打电话g 3 4 0 2 (M.empty,0) []
,我希望[[2,1,0,1]]
结果。相反,我看到[[2,1,0,1],[2,1,0,1]]
.
该程序应该m
通过每次将不同的数字添加到列表中来累积不同的长度数字模式,到达时返回向下,到达时返回n-1
向上0
。当向上和向下方向递归调用函数时,明显的问题发生在中间。
如果我像这样注释掉第 11 行:
else g n m (digitCount + 1) (lastDigit + 1) (hash',hashCount') (lastDigit:digits)
-- g n m (digitCount + 1) (lastDigit - 1) (hash',hashCount') (lastDigit:digits)
我得到正确的结果[]
就像注释掉第 11 行并将第 10 行修改为:
else g n m (digitCount + 1) (lastDigit - 1) (hash',hashCount') (lastDigit:digits)
再次,正确的结果[[2,1,0,1]]
为什么g
使用接线员拨打两次电话时++
,我得到[2,1,0,1]
的是两个而不是一个?在我看来,每个结果都g
应该是不同的,因为在任何递归调用中,不同的数字顺序正在(或应该)累积。
提前致谢。
import qualified Data.Map as M
g :: Int -> Int -> Int -> Int -> (M.Map Int Bool, Int) -> [Int] -> [[Int]]
g n m digitCount lastDigit (hash,hashCount) digits
| digitCount == m = if test then [reverse digits] else []
| otherwise =
if lastDigit == 0
then g n m (digitCount + 1) (lastDigit + 1) (hash',hashCount') (lastDigit:digits)
else if lastDigit == n - 1
then g n m (digitCount + 1) (lastDigit - 1) (hash',hashCount') (lastDigit:digits)
else g n m (digitCount + 1) (lastDigit + 1) (hash',hashCount') (lastDigit:digits)
++ g n m (digitCount + 1) (lastDigit - 1) (hash',hashCount') (lastDigit:digits)
where test = hashCount == n
(hash',hashCount') =
if test
then (M.empty,hashCount)
else case M.lookup lastDigit hash of
Just anyting -> (hash,hashCount)
Nothing -> (M.insert lastDigit True hash,hashCount + 1)