重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先我们回答一下,你的这个题目中是有用到递归的。
成都创新互联专注于汇川网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供汇川营销型网站建设,汇川网站制作、汇川网页设计、汇川网站官网定制、成都小程序开发服务,打造汇川网络公司原创品牌,更为您提供汇川网站排名全网营销落地服务。
我们先来了解下什么是递归:
递归的定义:直接或间接调用自己的函数成为递归函数(recursionfunction)。在求解某些具有随意性的复杂问题时经常使用递归,例如求解阶乘或者两个数的最大公约数等。因为这时解的具体“大小”不受限制,函数可以一直递归调用,直到问题解决。
递归的要求:递归函数必须定义一个终止条件;否则,函数就会“永远”递归下去,这意味着函数会一直调用自身直到程序栈耗尽,这种“永远”递归下去的现象叫做“无限递归错误”(infiniterecursion error)。
递归的特点:
1、在函数f()中,会对函数f()自己进行调用。
2、无限递归实际上是不允许的;递归函数必须定义一个终止条件,即什么情况下终止递归,终止继续调用自己,如果没有终止条件,那么函数将一直调用自己,知道程序栈耗尽,这时候等于是写了一个Bug!
3、 递归算法解题通常代码比较简洁,但不是很容易读懂。
4、 递归的调用需要建立大量的函数的副本,尤其是函数的参数,每一层递归调用时参数都是单独的占据内存空间,他们的地址是不同的,因此递归会消耗大量的时间和内存。而非递归函数虽然效率高,但相对比较难编程。
5、 递归函数分为调用和回退阶段,递归的回退顺序是它调用顺序的逆序。
如果以上对你有帮助,青采纳一下, 谢谢。
C语言没有bool类型,需要自己来定义,同时IsPrime函数的变量i重复定义了修改如下。
# include stdio.h //这是代码
typedef enum //定义bool类型
{
true = 0,
false = 1,
}bool;
bool IsPrime(int m) //第三行
{
int i;
for (i = 2; i m; ++i)// 多了一个int
{
if(m%i == 0)
break;
}
if(i == m)
return true;
else
return false;
}
1.执行
f(3)。
执行
printf("%d",f(3));
时,是先执行的
f(3)
把
f(3)
的结果计算出来,才能执行
printf。所以先执行的
f(3)。
在执行
f(3)
时,由于参数不等于1,执行了
printf("%d",n);
所以输出3。
2.下一条语句执行的是
return
n-f(n-1);
此时,会先计算
n-1
再计算
f(n-1)
再
return;
所以计算
n-1
等于2,执行
f(n-1)
是执行的
f(2)。
在执行
f(2)
时,由于参数不等于1,执行了
printf("%d",n);
所以输入2。
3.继续执行
return
n-f(n-1);
此时,n=2,所以先计算
n-1,然后执行
f(n-1)
即
f(1),
在执行
f(1)
时,由于n==1满足,所以直接返回的是1,此时会返回到调用这个函数
f(1)
的位置,即执行
f(2)
函数里面的
return
n-f(n-1)
即 return
2-f(1)
那个位置,计算结果
f(1)
等于1,所以
f(2)
执行的返回结果是
return
2-f(1)
等于
return
2-1;
等于
return
1;
这个会返回到执行调用
f(2)
那个位置,即执行
f(3)
的
return
n-f(n-1)
的位置,即计算
return
3-f(2),此时知道了计算结果
f(2)
等于
1,所以
return
3-f(2)
就等于
return
3-1;
即
return
2;
也就是执行
f(3)
的结果是等于
2。这个函数返回,正好返回到调用f(3)
的位置,即
main()
里面的
printf("%d",f(3));,所以,又输出了值2。
到此为止,程序执行结束,输出的是
322