尾遞歸調用的時候不用在棧中保存以前運算的值,相比線性遞歸就節省了棧資源。好比計算階乘:spa
線性遞歸:code
public int rescuvie(int i){
return i>1 ? i * rescuvie(i-1) : 1;
}
尾遞歸:blog
public int rescuvie(int i,int a){
return i>1 ? rescuvie(i-1,a*i) : 1;
}
尾遞歸計算5的階乘,直接調用rescuvie(5,1)遞歸
尾遞歸的做用:資源
對於線性遞歸,它的遞歸過程:class
{5 * Rescuvie(4)}
{5 * {4 * Rescuvie(3)}}
{5 * {4 * {3 * Rescuvie(2)}}}
{5 * {4 * {3 * {2 * Rescuvie(1)}}}}
{5 * {4 * {3 * {2 * 1}}}}
{5 * {4 * {3 * 2}}}
{5 * {4 * 6}}
{5 * 24}
120
對於尾遞歸,它的遞歸過程:
rescuvie(5)
rescuvie(5, 1)
rescuvie(4, 5)
rescuvie(3, 20)
rescuvie(2, 60)
rescuvie(1, 120)
120
因此線性遞歸運行的過程當中,要存以前計算得出的值放在堆棧裏。若是使用尾遞歸,能夠節省棧資源