十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
我解释下具体执行过程:
创新互联公司主营辰溪网站建设的网络公司,主营网站建设方案,成都app软件开发公司,辰溪h5成都微信小程序搭建,辰溪网站营销推广欢迎辰溪等地区企业咨询
printf("%d!=%ld\n",num,mul(num));
这里调用了mul(num)方法,第一个值是5,进入方法后,
if(51) x=5*mul(5-1);
这里又调用了一次方法,
mul(5-1)
这里就是递归调用了,需要把4的值带入方法又执行一次,
变成:if(41) x=4*mul(4-1);
这里又调用了一次方法,
mul(4-1)
依次类推为:if(31) x=3*mul(3-1);
if(21) x=2*mul(2-1);
这里看懂了没,递归函数关键字在“递”和“归”,相当于循环,一直到条件不满足时在“归”,一步步return直到第一个调用的mul方法。在return主函数。
也就是从最后一次调用
mul(2-1)时
n的值为1了,执行else语句,结束“递”方法操作,return语句,返回X=1,那么接下来变为
if(21) x=2*1,返回X=2,接下来变为:
if(31) x=3*2,返回X=6,接下来变为:
if(41) x=4*6,返回X=24,接下来变为:
if(51) x=5*24,返回X=120 结束递归调用。
希望你能看懂,还有问题在补充吧!
又是你....
首先你和1008一样又想先把数据存起来,再一起处理了....这个思路不对,应该是这样的:
while(数据没结束){
初始化变量;
读入数据;
处理数据;
输出结果;
}
再说这个题,这个题我觉得你想问的是记忆化递归要如何记忆。
这题我没做,看下觉得要么是记忆化递归,要么是推导公式。首先你要理解正常的递归做这个题要如何做。你现在的做法正是一般的递归做法。加入记忆化是这样:
int dp[21][21][21];
int w(int a,int b,int c)
{
if(dp[a][b][c])return dp[a][b][c];
if(a=0||b=0||c=0)
return 1;
if (a20||b20||c20)
return w(20,20,20);
if (a b b c)
return dp[a][b][c]=w(a,b,c-1) + w(a,b-1,c-1) - w(a,b-1,c) ;
else
return dp[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1, b, c-1)- w(a-1, b-1, c-1) ;
}
即每次做完一个结果就把这个结果记录到对应的dp[a][b][c]中,这道题只要a,b,c相同结果就相同
然后在每次左前检查这个a,b,c对应的结果算过没有,算过直接读,没算再去算
这和调用一个函数一样啊, 在调用函数之前在栈上为形参分配空间, 所以w值存在栈上。。。
#includestdio.h#includestring.h
void main()
{
void fun(int *a,int index);
void printIntArray(int *a);
int a[100]={1,2,3,4,5};
printIntArray(a);
fun(a,0);
printf("\n");
printIntArray(a);
printf("\n");
}
void fun(int *a,int index)
{
int tmp;
if(index=100/2)
{
tmp = a[index];
a[index] = a[100-index-1];
a[100-index-1] = tmp;
fun(a, ++index);
}
}
void printIntArray(int *a)
{
int i;
for(i=0; i100; i++)
printf("%d ",a[i]);
}