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

Haskell 递归调用一个函数,返回一个列表,没有空的列表大小写?,haskell,recursion,Haskell,Recursion,好的,我会尽量提供这里需要的所有信息。这是我们在课堂上为了解决河内塔而必须实现的许多函数中的一个。该函数以3个塔的相反顺序(最大值>最小值)、我的问题中的光盘数量和一个字符串(以空开头)获取已添加到列表中的塔的级别 该函数需要递归地逐步遍历塔的每个级别,并以单个字符串打印该级别中的光盘。希望这是有道理的。如果需要,我可以详细说明 以下是我目前掌握的情况: stringFromBoardHelper :: Tower -> Tower -> Tower -> Int ->

好的,我会尽量提供这里需要的所有信息。这是我们在课堂上为了解决河内塔而必须实现的许多函数中的一个。该函数以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案例,那么我会因为没有详尽的案例而得到错误。有什么想法吗

stringFromBoardHelper _ _ _ _ [] = []
只要
discString
为空,此行将适用于任何风塔和任何
n

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

您可能需要将该行放在最后,或者专门化
\uu
以使它们与较少的情况匹配


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

如果
[String]
参数表示您已经完成的工作,那么它为空不是一个很好的基本情况!你的基本情况应该是没有工作要做,而不是所有的工作都要做。你的基本情况应该是“所有的东西都在我想要的地方”。。。我的基本情况非常明显。真不敢相信我花了两个小时在这个功能上。谢谢你,哈哈。你说的方式让它点击出于某种原因,我的基本情况应该是基于n。