用递归进行数组求和

  • Post author:
  • Post category:其他


记录一下zj提前批算法一面:

用递归进行数组求和:

算法马上就写出来了,但是运行的时候一直报栈溢出,我以为是我的递归逻辑出问题了,就一直在改,

但是还是报错,最终卡住了… … 开局就GG,自己也慌得一批,导致我第二道题也没做出来。

最初写的代码如下:

/**
 * @author guochao
 * @date 2022/7/22
 */
public class Main {
    public static void main(String[] args) {
        int[] nums ={1,2,3};
        System.out.println("sum="+getSum(nums, 0));
    }
    public static int getSum(int[] nums, int i){
        if(i >= nums.length) return 0;
        int sum  = getSum(nums, i++);
        int result = nums[i] + sum;
        return result;
    }
}

结果:

在这里插入图片描述

由于面试的时候是白板,无法debug,面试结束后,我自己在idea里面debug,最终才发现了问题!!!

问题出在i++、i+1、++i。

我的代码中写的是i++,但是正确写法是i+1。

经过这次教训,我对于自增的三中写法有了更深刻的认识,相信下一次不会再错了。

i+1:不改变原来i的值,除非强制赋值,比如:i = i + 1;

i++和++i都会改变i的值,但是自增的顺序不同,i++是先使用在自增,++i是先自增再使用。

这里使用是如何定义的呢?我觉得直观来说可以分为两点:

1、直接赋值

eg:a = i++;

2、调用函数的形参赋值

eg:function(++i);

可以看下,下面三个例子:

/**
 * @author guochao
 * @date 2022/7/22
 */
public class test {
    public static void main(String[] args) {
        for(int i=0; i<5; i++){
            aa(i++);                     // 注意这行的改变!
        }
    }

    public static void aa(int i){
        System.out.print(i + " ");
    }
}

在这里插入图片描述

/**
 * @author guochao
 * @date 2022/7/22
 */
public class test {
    public static void main(String[] args) {
        for(int i=0; i<5; i++){
            aa(++i);                     // 注意这行的改变!
        }
    }

    public static void aa(int i){
        System.out.print(i + " ");
    }
}

在这里插入图片描述

/**
 * @author guochao
 * @date 2022/7/22
 */
public class test {
    public static void main(String[] args) {
        for(int i=0; i<5; i++){
            aa(i+1);                     // 注意这行的改变!
        }
    }

    public static void aa(int i){
        System.out.print(i + " ");
    }
}

在这里插入图片描述



版权声明:本文为weixin_46369022原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。