線性遞歸和尾遞歸

尾遞歸調用的時候不用在棧中保存以前運算的值,相比線性遞歸就節省了棧資源。好比計算階乘: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
因此線性遞歸運行的過程當中,要存以前計算得出的值放在堆棧裏。若是使用尾遞歸,能夠節省棧資源
相關文章
相關標籤/搜索