请求解释一下函数的整个过程

img


不太懂里面函数调用的过程,那个r(n-i)<0具体是如何计算出数值的?

你从下往上推,n<=5时r(n)=n,n=6时r(6)=-1。后面就简单地多了,r(7)=1,r(8)=2......r(17)=9

这个是按照1,2,3,4,5,-1进行循环的。

首先,这是一个递归,当 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(7)的话,进入循环,i=1,判断r(6)是否小于0,r(6)=-1<0,返回i值,即r(7)=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里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出