首页 > 解决方案 > 了解不同形式的递归

问题描述

我正在尝试在 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)

标签: haskellrecursion

解决方案


策略是看每个递归调用的返回值是如何使用的:

  • f1,返回值本身立即返回
  • f2中,单个递归调用的返回值用于计算原始调用的返回值。
  • f3f4中,多个递归调用的返回值用于计算原始调用的返回值。

(我认为,您需要进行递归调用f3以计算另一个递归调用的参数这一事实不会影响您被要求进行的任何分类。)


推荐阅读