把N改大一点就不行了?比如我改到64,S不变,我跟踪一步一步执行,后面结果就不对了,按道理应该没问题的啊,要是改,改哪里?哪里影响的?
谁有空讲讲怎么这样构造递归出来的,我把我写的上面函数注解发来,大家看看哪里理解的不对。好几个地方回退,仅仅回退了两个,我比较迷惑,递归比较晕,求助啊,
#include <stdio.h>
#define N 64
#define S 25
int stack[N];
int f()
{
static int sum=0,pos=0,a=1;
//sum表示累加和,pos当前指向的存储栈的位置,a表示尚未存入栈的当前操作数;
int i;
sum=sum+a;//累加
if(sum==S)
{
stack[pos]=a;//当前操作数存入栈
for(i=0;i<=pos;i++)
{
printf("%d + ",stack[i]);
}
printf("\b\b=%d\n",S);//以上格式输出栈内容
sum=sum-stack[pos]-stack[pos-1];//总和中去掉栈的最后两项
a=stack[pos-1]+1;//倒数第二项+1并赋给a;
stack[pos--]=0;
stack[pos]=0;//最后两项置0,准备新查找。
f();
}
else if(sum>S)//若和超过S
{
if(pos==0)return 0;
pos--;//指示位置后移
sum=sum-a-stack[pos];//不再加a并减去指示位置。
stack[pos]=0;//指示位置置0
f();
}
else if(a<N)//若未到最后
{
stack[pos++]=a;//a存入栈
a++;
f();
}
else if(a==N && pos>0)//a=最大值且pos不在栈开头
{
pos--;//后移pos
sum=sum-a-stack[pos];总和不加a,并去掉栈当前值
a=stack[pos]+1;//增1
stack[pos]=0;//置0
f();
}
else
{
return 0;
}
}
int main(int argc,char**argv)
{
printf("start\n");
f();
printf("end\n");
return 0;
}