无论输入是递归的,函数是否仅调用一次?

-3 recursion haskell

考虑一个函数,该函数执行一个操作并且无论输入是什么,最多只能调用一次(不超过一个“递归”级别)。该函数是否被认为是递归的?

例:

join1 :: [Maybe a] -> [a]
join1 [Just x] = [x]
join1 [Nothing] = []
join1 (x) = concat (map join1 (map (\k->[k]) x))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,在调用时:Join1 [什么都没有,只有2,只有3,...]将在每个元素上调用join1函数,立即输入终止条件

chi*_*chi 5

是的,它是递归的。运行时的调用次数与运行时递归深度无关。如果定义出现在中,x = expression则表示该定义是递归的,指的是我们现在正在定义的定义。xexpressionx

简而言之,“递归”是定义的语法属性,并且不考虑运行时行为。

举一个愚蠢的例子,这个定义是递归的,即使它从未在运行时调用它自己。即使可以简单地简化为一种非递归形式。

identity :: a -> a
identity x = (\_ -> x) identity
Run Code Online (Sandbox Code Playgroud)