首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归函数调用应该终止还是它的实现是错误的?

递归函数调用应该终止还是它的实现是错误的?
EN

Stack Overflow用户
提问于 2017-06-09 19:09:33
回答 2查看 71关注 0票数 3

我正在从第一性原则开始Haskell编程,我一直在努力证明我已经正确地回答了最后一个问题的问题1,而不是列表练习小节。下面的函数调用不会终止,我无法判断这是预期的,还是我的实现是错误的。

代码语言:javascript
复制
data BinaryTree a = Leaf 
                  | Node (BinaryTree a) a (BinaryTree a) 
                    deriving (Eq, Ord, Show)

unfold :: (a -> Maybe (a, b, a)) -> a -> BinaryTree b
unfold func seed = 
  case (func seed) of
    Just (l, m, r) -> Node (unfold func l) m (unfold func r)
    Nothing -> Leaf

我认为每个a/x最终都会减少/递增,直到它导致if接受True分支并返回一个Nothing/Leaf

代码语言:javascript
复制
func = (\x -> if (x < 0 || x > 10) 
                then Nothing  
                else Just (x - 1, x, x + 1))
unfold func 5
-- Node (Node (Node (Node (Node (Node Leaf 0 ... ad infinitum
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-09 19:25:41

您的实现会生成无限多个对unfold的调用。

考虑第一个递归调用,其中5的初始种子值被拆分为左和右子树的46。在这里,您将这个新种子拆分为左边的35,右边的57,因此您定义了一个无限大的树。

票数 2
EN

Stack Overflow用户

发布于 2017-06-09 19:29:11

如果尝试在func之外调用unfold,则可以理解程序永不终止的原因。在这里,我将func重命名为unfolder,因为Haskell不喜欢它有与func参数相同的名称。

在边界附近,unfolder返回以下值:

代码语言:javascript
复制
*So> unfolder 1
Just (0,1,2)
*So> unfolder 0
Just (-1,0,1)
*So> unfolder (-1)
Nothing

对于unfolder 0,下一次左分支明显地计算为Nothing,但右边的分支是unfolder 1,它的计算结果为Just (0,1,2),等等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44465149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档