!func(i+1,n)中去掉!和不去掉有何区别,程序都可正常运行,结果小弟我也知道,就是搞不明白程序运行的思路,望各个大神详细解释一番
!func(i+1,n)中去掉!和不去掉有何区别,程序都可正常运行,结果我也知道,就是搞不明白程序运行的思路,望各个大神详细解释一番!
#include <stdio.h>
#include <stdio.h>
int func(int i, int n);
int main(void)
{
func(2,10);
printf("\n");
func(10,3);
return 0;
}
int func(int i,int n)
{
return (i<n && printf("%d\n",i)) && !func(i+1,n)
|| printf("%d\n",i);
}
------解决方案--------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
------解决方案--------------------
return (i<n && printf("%d\n",i)) && !func(i+1,n)|| printf("%d\n",i);
举个例子吧,fun(2,10);这个函数会从2打印到10然后再逆序打印到2
关于&& ||这类的运算符,计算方式是从左至右。
而且 A&&B 计算规则是,若A为FALSE,则直接返回FALSE,不计算B
A||B 若A为TRUE则直接返回TRUE,不计算B
就看fun(2,10)这个例子吧。
首先 第一个条件 (i<n && printf("%d\n",i))
那若i<n,则打印i,由于第一个条件和第二个条件是&&关系,则需要计算第二个条件
进入递归 fun(3,10)....一直到fun(10,10)
对于fun(10,10),第一个条件 (i<n && printf("%d\n",i))不满足,第二个&&直接跳过,到第三个条件printf("%d\n",i);由于printf返回的是打印的字符个数,因此return True;
出栈,运行到fun(9,10) 的第二个条件!fun(10,10)为false 则需要进入第三个或的条件,print 9
然后就是递归出栈
若删掉第二个条件的!,那么这个函数只会打印2-10,不会再逆序打印了
因为return true ,根据A||B ,若A为真,则B不参与计算。
#include <stdio.h>
#include <stdio.h>
int func(int i, int n);
int main(void)
{
func(2,10);
printf("\n");
func(10,3);
return 0;
}
int func(int i,int n)
{
return (i<n && printf("%d\n",i)) && !func(i+1,n)
|| printf("%d\n",i);
}
------解决方案--------------------
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
------解决方案--------------------
return (i<n && printf("%d\n",i)) && !func(i+1,n)|| printf("%d\n",i);
举个例子吧,fun(2,10);这个函数会从2打印到10然后再逆序打印到2
关于&& ||这类的运算符,计算方式是从左至右。
而且 A&&B 计算规则是,若A为FALSE,则直接返回FALSE,不计算B
A||B 若A为TRUE则直接返回TRUE,不计算B
就看fun(2,10)这个例子吧。
首先 第一个条件 (i<n && printf("%d\n",i))
那若i<n,则打印i,由于第一个条件和第二个条件是&&关系,则需要计算第二个条件
进入递归 fun(3,10)....一直到fun(10,10)
对于fun(10,10),第一个条件 (i<n && printf("%d\n",i))不满足,第二个&&直接跳过,到第三个条件printf("%d\n",i);由于printf返回的是打印的字符个数,因此return True;
出栈,运行到fun(9,10) 的第二个条件!fun(10,10)为false 则需要进入第三个或的条件,print 9
然后就是递归出栈
若删掉第二个条件的!,那么这个函数只会打印2-10,不会再逆序打印了
因为return true ,根据A||B ,若A为真,则B不参与计算。