你从下往上推,n<=5时r(n)=n,n=6时r(6)=-1。后面就简单地多了,r(7)=1,r(8)=2......r(17)=9
n<=5
的时候,r(n)=n
r(6)的话,进入循环,i等于1,判断r(5) = 5 是否小于0,否;i++
i=2,i<= NUM,判断r(4)是否小于0,否,i++
i=3,i<= NUM,判断r(3)是否小于0,否,i++
i=4,i<= NUM,判断r(2)是否小于0,否,i++
i=5,i<= NUM,判断r(1)是否小于0,否,i++
i=6,i<= NUM不成立,直接返回-1,即r(6)=-1
这时候跳出循环,直接return -1;即r(6)=-1
r(8)的话,进入循环,i等于1,判断r(7) = 1 是否小于0,否;i++
i=2,判断r(6)是否小于0,r(6)=-1<0,返回i值,即r(8)=2
r(9)的话,进入循环,i等于1,判断r(8) = 2 是否小于0,否;i++
i=2,i<= NUM,判断r(7)是否小于0,否,i++
i=3,i<= NUM,判断r(6)是否小于0,是,返回i值,即r(9)=3
r(10)的话,进入循环,i等于1,判断r(9) = 3 是否小于0,否;i++
i=2,i<= NUM,判断r(8)是否小于0,否,i++
i=3,i<= NUM,判断r(7)是否小于0,否,i++
i=4,i<= NUM,判断r(6)是否小于0,是,返回i值,即r(10)=4
r(11)的话,进入循环,i等于1,判断r(10) = 4 是否小于0,否;i++
i=2,i<= NUM,判断r(9)是否小于0,否,i++
i=3,i<= NUM,判断r(8)是否小于0,否,i++
i=4,i<= NUM,判断r(7)是否小于0,否,i++
i=5,i<= NUM,判断r(6)是否小于0,是,返回i值,即r(11)=5
r(12)的话,进入循环,i等于1,判断r(11) = 5 是否小于0,否;i++
i=2,i<= NUM,判断r(10)是否小于0,否,i++
i=3,i<= NUM,判断r(9)是否小于0,否,i++
i=4,i<= NUM,判断r(8)是否小于0,否,i++
i=5,i<= NUM,判断r(7)是否小于0,否,i++
i=6,i<= NUM不成立,直接返回-1,即r(12)=-1
因此,r(13) = 1,r(14) = 2,,r(15) = 3,r(16) = 4,r(17) = 5,r(18) = -1,...
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出