递归调用一个返回列表的函数,没有空列表大小写?

时间:2017-10-25 07:24:13

标签: haskell recursion

好的,我会尽力提供所需的所有信息。这是我们必须在课堂上实现的许多功能的一个功能,以解决河内塔。有问题的功能包括3个塔,反向顺序(最大>最小),我的问题中的光盘数量,以及从塔的水平开始为空的字符串已被添加到列表中。

该功能需要递归地逐步遍历塔的每个级别,并在单个字符串中打印该级别的光盘。希望这是有道理的。如果需要,我可以详细说明。

这是我到目前为止所拥有的:

stringFromBoardHelper :: Tower -> Tower -> Tower -> Int -> [String] -> [String]
stringFromBoardHelper _ _ _ _ [] = []
stringFromBoardHelper (t1:t1s) (t2:t2s) (t3:t3s) n discString = if n > 0 
        then stringFromBoardHelper t1s t2s t3s (n-1) ((stringFromThreeDiscs t1 t2 t3 n) : discString)
        else discString

我的问题是,现在我的代码只返回空列表,因为我的函数以空列表开头。

但是,如果我删除空的listt案例,那么我会因为没有详尽的案例而收到错误。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

stringFromBoardHelper _ _ _ _ [] = []

只要n为空,此行将适用于任何塔,任何discString

它也是定义中的第一行,因此首先尝试它。

您可能需要将该行放在最后,或者专门设置_以使它们匹配较少的情况。

(这应解决您遇到的主要问题 - 您的代码可能会有其他问题)