Java递归函数返回值与内部打印值不符?求代码解析
递归函数返回值异常原因解析
你的问题核心在于两点:Java的参数传递是值传递,以及代码中没有利用递归调用的返回值。
代码执行流程拆解
给定数组arr={0,1,2,3,4,5,6,7,8,9},main函数调用func(arr,3,0)的完整执行步骤如下:
- 第一层调用(n=3,sum=0):
- n不等于0,执行
sum += arr[3],sum变为0+3=3,打印Inside functions 3 - 调用
func(arr,2,3),但完全忽略这个子调用的返回值 - 直接返回当前栈帧里的sum值3 → 这就是main函数最终拿到的结果
- n不等于0,执行
- 第二层调用(n=2,sum=3):
- n不等于0,执行
sum += arr[2],sum变为3+2=5,打印Inside functions 5 - 调用
func(arr,1,5),忽略返回值 - 返回当前sum值5(这个结果被第一层调用丢弃)
- n不等于0,执行
- 第三层调用(n=1,sum=5):
- n不等于0,执行
sum += arr[1],sum变为5+1=6,打印Inside functions 6 - 调用
func(arr,0,6),忽略返回值 - 返回当前sum值6(这个结果被第二层调用丢弃)
- n不等于0,执行
- 第四层调用(n=0,sum=6):
- 触发终止条件,返回sum值6(这个结果被第三层调用丢弃)
关键问题说明
- 值传递的特性:Java中基本类型参数是值传递,每次递归调用时,传递的sum是当前值的副本。子调用里对sum的修改只会作用于自己栈帧内的副本,不会影响父调用的sum变量。
- 未利用递归返回值:代码中调用
func(arr,n-1,sum)后,没有将子调用的返回结果赋值给当前sum,也没有直接返回该结果,导致最终返回的是最上层调用栈里的sum值,而非递归最深层的计算结果。
修正方案
如果要得到预期的返回值6,有两种简单修改方式:
- 方式一:接收子调用的返回值并更新当前sum
static int func(int[] arr,int n,int sum){ if (n==0) return sum; sum+=arr[n]; System.out.println("Inside functions "+sum); sum = func(arr,n-1,sum); // 接收子调用的返回结果 return sum; }
- 方式二:直接返回子调用的结果
static int func(int[] arr,int n,int sum){ if (n==0) return sum; sum+=arr[n]; System.out.println("Inside functions "+sum); return func(arr,n-1,sum); // 直接返回子调用的计算结果 }
内容的提问来源于stack exchange,提问作者AKSHAY GUDELLI
相关产品推荐
相关产品推荐

