haskell - 无论输入递归如何,一个函数是否只调用自己一次?
问题描述
考虑一个函数,不管输入是什么,它最多执行一次操作并调用自身一次(不超过一个“递归”级别)。这个函数被认为是递归的吗?
例子:
join1 :: [Maybe a] -> [a]
join1 [Just x] = [x]
join1 [Nothing] = []
join1 (x) = concat (map join1 (map (\k->[k]) x))
在这种情况下,当调用:Join1 [nothing, just 2, just 3,...] 会在每个元素上调用join1函数,立即进入终止条件
解决方案
是的,它是递归的。运行时的调用次数和运行时递归深度无关。如果出现在 中,则说定义x = expression
是递归的,指的是我们现在正在定义的。x
expression
x
简而言之,“递归”是定义的句法属性,不考虑运行时行为。
作为一个愚蠢的例子,这个定义是递归的,即使它在运行时从不调用自己。即使它可以简单地简化为非递归的。
identity :: a -> a
identity x = (\_ -> x) identity
推荐阅读
- ios - UIView draw(_ rect: CGRect) 不适用于多线程
- angular - 使用 Angular 在 Firebase 中使用事务的正确方法是什么
- c# - C# WPF 更新状态栏文本和来自另一个窗口的进度
- java - 如何在 Java 中跳过 Regex 的某些部分?
- javascript - 如何按随机整数/变量(onclick)进行计数?
- c# - Identity Server 4 OpenID Connect Discovery 是否应该公开?
- python - quickfix python 如何使用 SSLSocketInitiator?
- cypress - 如何使用 Cypress.io 将 baseUrl 作为参数发送
- typescript - 在打字稿中获取字典/对象键作为元组
- java - MediaPlayerService 销毁后传输控件不更新