关于递归函数somme计算数组元素和的原理咨询
递归求和函数
somme的执行逻辑拆解 先看你的代码:
int somme(int t, int tab[]) { if (t == 0) return 0; return tab[t - 1] + somme(t - 1, tab); }
这个函数的核心是递归回溯时累加元素,你觉得“不是从最后一个元素开始求和”,其实是混淆了递归调用顺序和实际累加顺序。
拿具体例子拆解,比如数组tab = [1,2,3],调用somme(3, tab)的完整流程:
- 第一次调用
t=3:不触发终止条件,执行return tab[2] + somme(2, tab)(即3 + somme(2, tab)),此时3暂时等待somme(2, tab)的结果。 - 第二次调用
t=2:执行return tab[1] + somme(1, tab)(即2 + somme(1, tab)),2等待somme(1, tab)的结果。 - 第三次调用
t=1:执行return tab[0] + somme(0, tab)(即1 + somme(0, tab)),1等待somme(0, tab)的结果。 - 第四次调用
t=0:触发终止条件,返回0。 - 开始回溯计算:
- 第三次调用拿到
0,计算1 + 0 = 1,返回给第二次调用。 - 第二次调用拿到
1,计算2 + 1 = 3,返回给第一次调用。 - 第一次调用拿到
3,计算3 + 3 = 6,最终返回结果6。
- 第三次调用拿到
你会发现:
- 递归调用是从数组末尾对应的长度(t=3)逐步缩小到0,看起来像是“从最后一个元素开始”发起调用。
- 但实际累加是从数组第一个元素(tab[0])开始,在回溯阶段依次加上后面的元素(tab[1]、tab[2])。
- 最终结果和“从第一个到最后一个依次累加”完全等价,本质上就是数组所有元素的和。
内容的提问来源于stack exchange,提问作者Junias
相关产品推荐
相关产品推荐

