递归函数FunctionZ求值解析请求:表格填充及步骤推导
递归函数FunctionZ的调用推导与表格填充
函数定义
首先明确给定的递归函数规则(用类Haskell语法表示):
FunctionZ [] = 0 FunctionZ[x:xs] = x + 2 * FunctionZ(xs)
规则解释:
- 当传入**空列表
[]**时,直接返回0(这是递归的终止条件,不会再继续调用自身) - 当传入**非空列表
[x:xs]**时:x是列表的head(第一个元素)xs是列表的tail(去掉第一个元素后的剩余部分)- 返回值 = 第一个元素
x+ 2 × 对剩余部分xs调用FunctionZ的结果
正确填充后的调用表格
| 调用次数 | 参数 | 返回值 |
|---|---|---|
| 1 | [4,2,5,3] | 52 |
| 2 | [2,5,3] | 24 |
| 3 | [5,3] | 11 |
| 4 | [3] | 3 |
| 5 | [] | 0 |
逐次调用详细推导
递归的计算逻辑是先拆解到终止条件,再从终止条件反向计算返回值,以下按调用顺序结合计算顺序讲解:
第5次调用(终止调用)
- 触发原因:第4次调用需要计算剩余部分的
FunctionZ值,此时剩余部分是空列表 - 参数:
[] - 直接匹配函数第一条规则,返回值为
0
第4次调用
- 触发原因:第3次调用需要计算剩余部分的
FunctionZ值,此时剩余部分是[3] - 参数:
[3] - 拆分列表:
x=3(第一个元素),xs=[](剩余部分) - 代入函数第二条规则:
3 + 2 × FunctionZ([]) - 替换第5次的返回值:
3 + 2×0 = 3 - 返回值:
3
第3次调用
- 触发原因:第2次调用需要计算剩余部分的
FunctionZ值,此时剩余部分是[5,3] - 参数:
[5,3] - 拆分列表:
x=5(第一个元素),xs=[3](剩余部分) - 代入函数第二条规则:
5 + 2 × FunctionZ([3]) - 替换第4次的返回值:
5 + 2×3 = 11 - 返回值:
11
第2次调用
- 触发原因:第1次调用需要计算剩余部分的
FunctionZ值,此时剩余部分是[2,5,3] - 参数:
[2,5,3] - 拆分列表:
x=2(第一个元素),xs=[5,3](剩余部分) - 代入函数第二条规则:
2 + 2 × FunctionZ([5,3]) - 替换第3次的返回值:
2 + 2×11 = 24 - 返回值:
24
第1次调用(初始调用)
- 参数:
[4,2,5,3] - 拆分列表:
x=4(第一个元素),xs=[2,5,3](剩余部分) - 代入函数第二条规则:
4 + 2 × FunctionZ([2,5,3]) - 替换第2次的返回值:
4 + 2×24 = 52 - 返回值:
52
原答案错误说明
原答案中第4、5次调用存在两处错误:
- 第5次调用的参数应为
[](空列表),而非[0],返回值是0而非3 - 第4次调用的返回值计算错误,正确值是
3而非8(原答案错误地违反了递归终止条件的规则)
内容的提问来源于stack exchange,提问作者Josh Hodson
相关产品推荐
相关产品推荐

