haskell - 了解不同形式的递归
问题描述
我正在尝试在 haskell 中练习一些递归函数。以下随机函数显示了一些不同形式的递归和迭代。我无法理解哪种形式的递归或迭代与函数相关联。我知道递归形式尾递归、线性递归和树递归以及常规迭代。是否有任何策略来分配我知道每个功能的四种不同形式之一?
f1 x y z = if x > y then f1 (x+2) (y-1) z else y
f2 x y z = if z /= 0 then y + x + f2 (x-1) (y-1) (z-2) else 1
f3 x y z = if y < 0 then True
else (f3 (f3 (x-2) (y-4) (z-6)) (4*y) (z-2)) + (f3 6 (y-2) (z*2))
f4 x y z = if z > 0 then (f4 (x-y) (y+1) (x-z)) + (f4 2 x z) else y+x-
(2*z)
解决方案
策略是看每个递归调用的返回值是如何使用的:
- 中
f1
,返回值本身立即返回 - 在
f2
中,单个递归调用的返回值用于计算原始调用的返回值。 - 在
f3
和f4
中,多个递归调用的返回值用于计算原始调用的返回值。
(我认为,您需要进行递归调用f3
以计算另一个递归调用的参数这一事实不会影响您被要求进行的任何分类。)
推荐阅读
- java - 口吃摇摆动画
- tensorflow - 张量流中的fast.ai等价物
- optimization - Fortran 与 MPI 文件写入/读取的性能
- closedxml - 将互操作转换为 ClosedXML
- html - 如何使用 grep 获取多个 HTML 标签的内容?
- r - 我们如何在包 networkD3 的 forceNetwork 函数中找到组?
- sql-server-2008 - 如何创建视图并将数据插入其中
- performance - MonetDb 在具有 20K 列的大表上的性能
- powershell - 通过 Powershell 脚本弹出 USB 磁盘
- python - ModuleNotFoundError:没有名为“skimage”的模块