
递归函数式自己调用自己,那么那个函数会一直执行到某个特定满足的条件的时候,才会从里面忘外面返回啊
比如就是f(f(f(3)));
进去之后,是从最里层的函数返回吧,那么就是倒着了
如果用再具体一点,就是堆栈的先进后出了,上一级的函数的东西都在底下,只有最后一层的在栈顶
考虑递归问题要从最终结果考虑
换句话说,7的值传入函数,不断调用自身,假设调用n次
第n次一定会是等于0或1的情况出现,此种情况下会返回3。
由于7是奇数,所以第n次一定是1被传入函数。
考虑这完第n次,小于n的情况下第一句 if(x==0||x==1) return 3;就没有了意义。
n-1次时,由于传入是1,返回的是3,所以p=x-fun(x-2)=3-fun(3-2),说明x=3,说明上一次传入的是3,而本次返回的是p=3-3=0
n-2次时,由于传入的是3,所以p=5-fun(5-2)=5-0=5,同理得X=5,而本次返回值为5
n-3次时,由于传入的是5,所以p=7-fun(7-2)=7-5=2,得X=7,所以这就是第1次调用,返回的是2
所以这个有n-3=1得n=4,函数一共调用了4次,最后返回的就是n-3次的返回值2
递归函数里不要
f(n,m) 调用 f(n,m) 如果 n,m不变
就是死循环,没有完了。
除非有专用的其他FLAG或数值管理。
你设的停止条件是 n<=1 m<=2
但是 f(n,m) 调用 f(n,m+1)
n没有变小 m越变越大,也是没有完了。
不知道你要算什么。如果是算次方的话用这个:
int f(int n,int m)
{
cout << "得出 f("<< n <<")";
cout << "得出 f2("<< m <<")";
if(m <= 0)
{
cout << "OK 1\n" ;
return (1);
}
else
{
cout << " f("<< n <<")";
cout << " f("<< n+1 <<")\n";
cout << " f("<< m <<")";
cout << " f("<< m+1 <<")\n";
// return (f(n,m)f(n,m+1));
return f(n, m-1)n;
}
}
输入 2 4 返回 16
数列公式: an = N^M
a0 = 1
an = a(n-1) N
算 M 次乘法。
# include <stdioh>
int hex(unsigned long int x, char a);
int main()
{
char a[9] = {0};
int n;
unsigned long int x;
scanf("%lu",&x);
n=hex(x,a);
printf("n=%d\n",n);
puts(a);
return 0;
}
int hex(unsigned long int x, char a)
{
char t[]="0123456789ABCDEF";
int n;
if(x<16)
{
a[0]=t[x];
return 1;
}
n=hex(x/16,a);
a[n]=t[x%16] ;
return 1+n ;// 这里为什么要是1+n ?
}
----------------你的代码不对-------------------我改了一下!
1+n就是 返回高位的位置比如 2048 那么应该就是 800
分析 16进来
if(x<16)
{
a[0]=t[x];
return 1;
}
第一次x=2048不执行
n=hex(x/16,a);
if(x<16)
{
a[0]=t[x];
return 1;
}
第二次x=128不执行
n=hex(x/16,a);
if(x<16)
{
a[0]=t[x];
return 1;
}
第三次x=8 a[0]=8;返回1
那么到第二次也就是128的这次 a[n]=t[x%16] ;n=1;结束后a=“80”
返回的是2 n+1啊
到2048的这次也就是第一次a[n]=t[x%16] n=2 结束后 a=“800”
最后返回2+1 就是3
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)