【问题标题】:Recursively calling a function, that returns a list, without an empty list case?递归调用一个函数,它返回一个列表,没有空列表的情况?
【发布时间】:2017-10-25 15:58:15
【问题描述】:

好的,我会尝试在此处提供所需的所有信息。这是我们必须在课堂上实现的许多功能之一,以解决河内塔问题。有问题的函数以相反的顺序(最大>最小)接收 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 案例,那么我会因为没有详尽的案例而收到错误。有什么想法吗?

【问题讨论】:

  • 如果[String] 参数代表你已经完成的工作,那么它是空的不是一个很好的基本情况!你的基本情况应该是没有工作要做的时候,而不是所有工作都要做的时候。您的基本情况可能应该是“所有部件都在我想要它们的地方”的意思。
  • .. 我的基本情况非​​常明显。我不敢相信我在这个功能上花了 2 个小时。谢谢你哈哈。由于某种原因,我的基本情况应该基于 n。

标签: haskell recursion


【解决方案1】:
stringFromBoardHelper _ _ _ _ [] = []

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

也是定义的第一行,所以先尝试。

您可能需要将该行放在最后,或者专门化 _s 以便它们匹配更少的案例。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-03
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 2021-12-22
    • 2014-08-03
    相关资源
    最近更新 更多