关于一句话递归的问题

来源:百度知道 编辑:UC知道 时间:2024/09/24 23:26:52
int p( int i, int N )
{
return ( N && PP && p( i+1, N-1 ) && ( N != 1 && PP ) )+1;

}
void main()
{

p(1,10);
}
哪位能告诉我这句话到底是怎么样执行的,详细点,谢谢
#define PP printf( "%d\n",i )

int p( int i, int N )
{
if (N && PP && p( i+1, N-1 ) && ( N != 1 && PP ))
return 2;
else
return 1;

}

如果PP是那样的宏的话,PP总是大于零的,p(i+1,N-1)不是1就是2,也恒为真,这样简化分析
int p( int i, int N )
{
if (N!=0)
{
printf("%d\n",i);
p(i+1,N-1);
if (N!=1)
printf("%d\n", i);
return 2;
}

else
return 1;

}

你这个PP是不是个宏定义啊?

不知道PP是什么,假设是个全局变量吧。其实不管PP值是什么,这一题的返回值只能是零。
首先要说明一个概念与操作(&&)是从左到右执行的,而且当与操作碰到第一个零的时候后面的与操作就不会再被执行,因为只要与一个零那么不管再与什么结果还是零。
有了这个概念这个题目就简单了,其实只需要看N && PP && p( i+1, N-1 ),因为后面的代码根本没有机会被执行,至于return()后面的+1更是无法被执行,因为都已经return了。
假设PP为0,那么很容易,此函数没有递归执行,直接返回0。N&&PP也就是10&&0,碰到0了,后面的不需执行,返回0。
假设PP非0,稍微复杂一点,此函数递归执行11次,还是返回0。
p(1,10)的返回值是10&&PP&&p(2,9)
p(2,9) 的返回值是 9&&PP&&p(3,8)
…………
…………
p(10,1)的返回值是 1&&PP&&p(11,0)
p(11,0)的返回值是 0&&PP好的碰到0了
那么p(11,0)的返回值就是0,那么p(10,1)的返回值1&&PP&&p(11,0)就是