重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
递归主要元素:入口,递归和结束。在定义递归函数时将这三个元素考虑进去就行;如: double callnext(int n)
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、重庆小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了郸城免费建站欢迎大家使用!
{
if(n1) return callnext(n-1)+3;
else return 1;
}
int main()
{
int m;
scanf("%d",m);
printf("result=%f",callnext(m));
return 0;
}
入口:callnext(m);递归:if(n1) return callnext(n-1)+3中的callnext(n-1);结束:else return 1;整个执行流程:callnext(m) 调用 callnext(m-1);callnext(m-1)调用callnext(m-1-1)。。。
callnext(2)调用callnext(1);callnext(1)=1;结束;
举一个用递归调用函数求输入非负整数的阶乘的例子,如下:
//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
int fact(int n){
if(n==1 || n==0) return 1;
else return n*fact(n-1);
}
int main(void){
int x;
while(1){
printf("Input x(int 12=x=0)...\nx=");
if(scanf("%d",x),x=0 x=12)//x12时会使结果溢出
break;
printf("Error,redo: ");
}
printf("%d! = %d\n",x,fact(x));
return 0;
}
所谓递归,说的简单点,就是函数自己调用自己,然后在某个特定条件下。结束这种自我调用。
如果不给予这个结束条件,就成了无限死循环了。这样这个递归也就毫无意义了。
如下面问题
1 1 2 3 5 8 13 21 ........n
分析可以看出, i 表示第几个数, n 表示该数的值
当i = 1 时, n = 1;
当i = 2 时, n = 1;
当i = 3 时 n = i1 + i2;
当i = 4 时 n = i2 + i3
所以可以写个函数
int fun(int n) // 这里的n代表第几个数
{
if(1 == n || 2 == n) // 第一个数
{
return 1;
}
else
{
return fun(n - 1) + fun(n - 2); // 这里就是自己调用自己,形成循环自我调用。
}
}
注: 以上代码只是用来演示递归,不包含错误校验。
在实际生产过程中。该代码不够健壮。
如此,就完成了递归。你就可以求得第n个数了。
何时考虑使用递归。
当你分析一个问题的时候,发现这个问题,是一个自我循环时,而且这个自我循环到一个给定值,就可以终止的时候,你就快要考虑递归了。
下面演示一个斐波那契数列前N项和#include stdio.h
#define COL 10 //一行输出10个
long scan()
{ //输入求fibonacci函数的第N项
int n;
printf("Input the N = ");
scanf("%d",n);
return n;
}
long fibonacci(int n)
{ //fibonacci函数的递归函数
if (0==n||1==n) { //fibonacci函数递归的出口
return 1;
}
else {
return fibonacci(n-1)+fibonacci(n-2);
//反复递归自身函数直到碰到出口处再返回就能计算出第n项的值
}
}
int main(void)
{
int i,n;
n = scan();
printf("Fibonacci数列的前%d项\n", n);
for (i=0; in;) //输出fibonacci函数前n项每项的值
{
printf("%-10ld",fibonacci(i++)); //调用递归函数并且打印出返回值
if(i%COL==0)
{ //若对COL取余等于0就换行,也就是控制每行输出多少个,
//而COL=10就是每行输出10个
printf("\n");
}
}
printf("\n");
return 0;
}