Java中方法--(其他语言成为过程或者函数),语句组合执行一个操作,定义成方法
Methods in Java - GeeksforGeeks
修饰符+返回值类型+方法名+参数列表+方法体
方法的签名,来区分不同方法的标示符-包含方法名+参数列表
主要是区分重载的方法
参数的值传递:Java只有值传递;
实参调用方法传递值给形参----顺序和类型一致
参数类型为基本数据类型的时候,不会修改原来的
参数类型为对象的时候,会修改引用的对象
@overload 方法的重载
相同名称的方法具有不同的参数列表
(int,double)无法确定调用(double,double)or (int,int)--->歧义调用
递归
优点-易于理解
缺点-时空复杂度高,重复计算,栈溢出
尾递归-最后执行的语句进行递归调用+返回值不属于表达式的一部分(也就是不是f(1)+f(2))
尾递归没有重复计算
public class Fibonacci{
// normal recursion
public static long fibonacci (long index){
if(index<=1) {
return index;
}else{
return fibonacci(index-1)+fibonacci(index-2);
}
}
// tail recursion
public static long fibonacciTailRecursion(long index){
return fibonacciTailRecursion(index,0,1);
}
public static long fibonacciTailRecursion(long index, int curr, int next){
if(index==0){
return curr;
}else{
return fibonacciTailRecursion(index-1,next,curr+next);
}
}
}
实际就是每一步计算curr, curr+next,
解决递归问题-尾递归,或者加记忆化的方法-functools-lru-cache-Python,Java的就用哈希表存起来,或者改用迭代;
https://juejin.cn/post/6939345971042058248
public class Solution {
/**
* @param n: an integer
* @return: an ineger f(n)
*/
public int fibonacci(int n) {
// write your code here
return fibonacci(n,0,1);
}
public int fibonacci(int n, int curr, int next){
if(n==1) {
return curr;
}else{
return fibonacci(n-1,next,curr+next);
}
}
}
假设n=5,fib(5,0,1)---> return fib(4,1,1)----->return fib(3,1,2)---2,2,3--->1,3,5, return 3
尾递归返回的都是一样的值,也就是fib(n,0,1)====fib(1,curr,curr+next), 所以最后返回curr即可
0,1,1,2,3