了解递归的评估(haskell)

Understand the evaluation of the recursion (haskell)

我有以下代码:

foo x y z
 | null x = y
 | null z = y
 | otherwise = foo (tail x) ([head x] ++ y ++ [head z]) (tail z)

和以下输入:

  1. [1] [2] [3]
  2. [1,3,4] [2] [3,4]
  3. [1,0] [2] [3,4]

案例 1 的评估:

otherwise: foo [] [1,2,3] []
null x = [1,2,3]
null z = [1,2,3]

输出:[1,2,3]

案例 2 的评估:

otherwise: foo [3,4] [1,2,3] [4]
           foo [4] [3,2,4] []
null z = [3,2,4]

输出:[3,1,2,3,4]

案例 3 的评估:

otherwise: foo [0] [1,2,3] [4]
           foo [] [0,2,4] []
null x = [0,2,4]
null z = [0,2,4]

输出:[0,1,2,3,4]

我不明白递归是如何在最后一步之后组成的

关于你问题中的代码,可能有错别字:在情况 2 中,xz 也不是 null,因此你进入 otherwise ,如您所写,但这意味着您在 [2,3] 上调用 foo,而不是 [3,4],以及 [1,2,3][4]。请检查您的问题。

转到你的我不明白在最后一步之后递归是如何组成的,事情很简单:你的函数正在砍掉元素x并且z(同时,就像在同一层递归中一样)只要它们中的每一个都有一个或多个,同时使 y 增长。然后,一旦 xz(或两者)变为 null,您将通过返回 y.

退出递归