Hello,你好呀,我是
灰小猿!一个超会写bug的程序猿! 用坚持缔造技术、用指尖敲动未来! 和很多小伙伴们一样,我也是一名奔波在Java道路上的“创造者”。也想靠技术来改变未来,改变世界!因为我们坚信每一次敲动键盘都能让生活变得更智能、世界变得更有趣! 在此专栏《Java核心面试宝典》记录我们备战梦想的【day 5】!

每天一个面试技术点,今天来和大家记录在Java面试中在方法和递归上的常见面试题及解答。
在Java中只有值传递而没有引用传递,所以Java中参数的传递只能使用值传递。
当参数的类型是基本数据类型时,传递的是实参的值,因此不能对实参进行修改。 当参数类型是对象时,传递的是对象的引用,此时可以对实参引用的对象进行修改,但是不能让实参引用新的对象。
方法的签名是由方法名和参数表共同构成的,修饰符和返回值不属于方法签名,方法签名一般用于方法的重载,方法的重载时方法签名必须不同。
出现歧义调用的时候会出现编译错误,
如果一个方法调用有多个可能的匹配,且编译器无法判断哪个方法最匹配,则称为歧义调用。
优点:使用递归算法的优点是代码简洁且容易理解,
缺点:时间和空间消耗比较大,每一次函数调用都需要在内存栈中分配空间,对栈的操作可能还需要时间,因此时间和空间复杂度较高。
如果子问题之间存在重叠,则在不加记忆化的情况下,可能产生重复计算导致时间复杂度过高。
由于栈的空间有限,如果递归调用的次数太多,则可能导致调用栈溢出。
解决递归的缺点有多种方式,尾递归是一种做法,另外还可以通过加记忆化的方式避免重复计算,以及改用迭代实现。
当递归调用是方法中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。
尾递归的特点是在返回时直接传回原始的调用者,而不用经过中间的调用者,这个特点很重要,因为大多数现代的编译器会利用该特点自动生成优化的代码。
使用尾递归代替普通的递归,可以在时间和空间方面都带来显著的提升。
斐波那契数列的普通递归实现:
/**
* 斐波那契数列普通递归实现
* @param index
* @return
*/
public static long fibonacci(long index) {
if (index <= 1) {
return index;
} else {
return fibonacci(index - 1) + fibonacci(index - 2);
}
}斐波那契数列的尾递归实现:
/**
* 斐波那契数列尾递归实现
* @param index
* @return
*/
public static long fibonacciTailRecursion(long index) {
return fibonacciTailRecursion(index, 0, 1);
}
/**
*递归体
* @param index 循环序列
* @param present 当前值
* @param next 下一个值
* @return
*/
public static long fibonacciTailRecursion(long index, int present, int next) {
if (index == 0) {
return present;
} else {
return fibonacciTailRecursion(index - 1, next, present + next);
}
}今天在关于方法的递归调用的核心面试考点中,我们需要掌握方法重载的特征是方法签名必须不同,了解递归调用的基本思想以及递归算法的优化策略。
关于方法和递归这一块的面试题就和大家分享这些,如果小伙伴们有遇到其他相关的面试题,欢迎在评论区留言提出,我会把大家提出的总结到文章内,欢迎小伙伴们一起评论区打卡学习!小伙伴们可也在左方加我好友一起探讨学习!
我是灰小猿,我们下期见!
