了解递归的评估(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] [2] [3]
[1,3,4] [2] [3,4]
[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 中,x
或 z
也不是 null
,因此你进入 otherwise
,如您所写,但这意味着您在 [2,3]
上调用 foo
,而不是 [3,4]
,以及 [1,2,3]
和 [4]
。请检查您的问题。
转到你的我不明白在最后一步之后递归是如何组成的,事情很简单:你的函数正在砍掉元素x
并且z
(同时,就像在同一层递归中一样)只要它们中的每一个都有一个或多个,同时使 y
增长。然后,一旦 x
或 z
(或两者)变为 null
,您将通过返回 y
.
退出递归
我有以下代码:
foo x y z
| null x = y
| null z = y
| otherwise = foo (tail x) ([head x] ++ y ++ [head z]) (tail z)
和以下输入:
[1] [2] [3]
[1,3,4] [2] [3,4]
[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 中,x
或 z
也不是 null
,因此你进入 otherwise
,如您所写,但这意味着您在 [2,3]
上调用 foo
,而不是 [3,4]
,以及 [1,2,3]
和 [4]
。请检查您的问题。
转到你的我不明白在最后一步之后递归是如何组成的,事情很简单:你的函数正在砍掉元素x
并且z
(同时,就像在同一层递归中一样)只要它们中的每一个都有一个或多个,同时使 y
增长。然后,一旦 x
或 z
(或两者)变为 null
,您将通过返回 y
.