尾-递
当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。 ---摘自百度百科-尾递归。
这里是关于尾-递的理解相关的,看相关概念的定义说的都很抽象,句里行里深深透漏着面向对象的特点,为读者留下广泛的想象空间。
这里根据自己的理解片面解读下递归:尾递归是无需使用下次递归调用结果在调用方进行计算的return语句。
按照最常见的例子简单说明下:
1 public int rescuvie(int n) { 2 return n == 1 ? n : n * rescuvie(n - 1); 3 } 4 5 public long tailRescuvie(int acc, int n) { 6 return n == 1 ? acc : tailRescuvie(acc * n, n -1); 7 } 8 9 @Test 10 public void test01() { 11 System.out.println(rescuvie(5)); 12 System.out.println(tailRescuvie(1, 5)); 13 }
区别:
尾递归的return 对象都是下次递归调用结果,多次递归拼接到一起就是 return acc,无需知道下次递归调用结果,直接return下次递归调用结果,一路return就完事了;
递归的return 对象还需要调用方与下次递归调用结果合并计算,故此需要保留每次递归调用结果,即中间状态。
再来回顾下这句话:当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。
返回值不属于表达式的一部分:无需知道下次递归调用结果,直接return下次递归调用结果;
整个函数体中最后执行的语句:就是return语句, 当然了其它的返回语句我不清楚,反正我用到的都是return。
有没有提供理解上的帮助呢,请多多交流不吝赐教。