c语言递归算法,C语言中的递归是什么意思
c语言递归算法,C语言中的递归是什么意思详细介绍
本文目录一览: C语言如何用递归算法求1!+2!+3!+...n!
#include
float fun(int n)
{
if(n==1) return 1;//如果n=1则直接返回1
return n*fun(n-1);//否则返回n*fun(n-1),以此计算n的阶乘,这条语句就是递归体
}
void main()
{
int i;
float sum=0;
for(i=1;i<=n;i++){
sum+=fun(i); //循环调用,用sum累计
}
printf("sum=%.2f\n",sum);
}
一楼的基本上正确,不过 定义 s 的时候需要用静态的,如下:
long sum(int n){
static long s = 0;
if(n == 1) return 1;
s =s + n*sum(n-1);
return s;
}
返回值就是阶乘之和
long sum(int n){
long s=0;
if(n==1) return 1;
s=s+n*sum(n-1)
return s;
}
#include
float fun(int n)
{
if(n==1) return 1;//如果n=1则直接返回1
return n*fun(n-1);//否则返回n*fun(n-1),以此计算n的阶乘,这条语句就是递归体
}
void main()
{
int i;
float sum=0;
for(i=1;i<=n;i++){
sum+=fun(i); //循环调用,用sum累计
}
printf("sum=%.2f\n",sum);
}
c语言输入一个整数,用递归算法将整数倒序输出.
#include
void Reverse(int n)//递归逆序输出n{if(!n)return;printf("%d",n%10);Reverse(n/10);}int main(void){int n;printf("Enter n:");scanf("%d",&n);Reverse(n);printf("\n");return 0;}
#include<stdio.h>
voidorder_print(intn)
{
if(n<10)
{
printf("%d",n);
return;
}
order_print(n/10);
printf("%5d",n%10);
}
void reverse_print(intn)
{
if(n<10)
{
printf("%-5d",n);
return;
}
printf("%-5d",n%10);
reverse_print(n/10);
}
int main(void)
{
int n;
printf("Inputainteger:");
scanf("%d",&n);
printf("Orderprint:");
order_print(n);
printf("\n");
printf("Reverseprint:");
reverse_print(n);
return0;
}
运行效果:
扩展资料:return的用法:
return的作用是结束正在运行的函数,并返回函数值。return后面可以跟一个常量,变量,或是表达式。函数的定义一般是这样的,例如:
inta(inti)//第一个int是函数的返回值的类型,也就是return后面跟的值的类型,a是函数的名称,括号里的是传递给函数的参数,int是参数的类型,i是参数的名字
{
...//省略函数体内容
returnb;//b必须与函数头的返回值一致(此处为int型)
}
简单函数举例:
intaddOne(intb)
{
returnb+1;
}
该函数的作用是取得一个数,将这个数加上1,再将结果返回
调用时这样:
intresult=addOne(2);//此时result的值为3
函数括号里的参数也可以为变量或能算出值的表达式
以上就是一个基本的函数,一般的函数都有返回值,也就是return后面跟的值,返回值可以为各种数据类型,如:int,float,double,char,a[](数组),*a(指针),结构或类(c++)
但不是所有函数都有返回值,如果某个函数无返回值,那么返回值的位置则为“void”关键字,此时函数体中无返回值,即无return的值。但是函数中也可出现return,即一个空的return句子,其作用是使函数立即结束,如voidprint()//括号中为空表示无传递参数、
{
printf("a");
printf("b");
return;//函数执行到此处结束
printf("c");
}//该函数只执行到return语句处,即屏幕上输出的为"ab"
C语言中的递归是什么意思
要理解递归,首先你要理解递归
简单来说就是一个函数调用到了自己,就可以称为递归.下面是简单的求n!的例子:
#include
#include
int fac(int n)
{
if(n==0)return 1;
return n*fac(n-1);
}
void main()
{
printf("%d\n",fac(6));
}
在函数调用中,如果直接或间接地调用该函数本身,称为递归调用.递归调用有时也称为循环定义.
例子:计算 n! (可表示为: n!=n(n-1)!)
#include
main()
{
long int fac(int n); /*函数声明*/
long int s;
int i;
scanf("%d",&i);
s=fac(i);
printf("%2d!=%1d\n",i,s);
}
long int fac(int n)
{
long int fa;
if(n==0)
fa=1;
else
fa=n*fac(n-1); / *采用了递归算法*/
return fa;
}
也就是一个函数的中再调用该函数,也就是说是循环的递归调用,但必须得有一个判断结束的条件,否则都成了死循环!
程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
扩展资料:
递归的应用
1、数据的定义是按递归定义的。(Fibonacci函数)
2、问题解法按递归算法实现。这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
3、数据的结构形式是按递归定义的。
递归的缺点
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
参考资料来源:百度百科-递归
C语言 用递归算法来解决猴子吃桃问题。:一天一只猴子摘下一堆桃子,吃了一半,觉得不过瘾,又多吃了一
#include
int n; //n作为全局变量
int peach(int x) //表示第x天有几个桃子
{
if(x < n) //如果x不是最后一天,那么这一天桃子的数量等于明天桃子数加1再乘以2
return 2*(peach(x+1) + 1);
else if(x == n) //如果是最后一天,返回1
return 1;
else
return -1; //异常
}
int main()
{
scanf("%d",&n); //输入题目中的n
printf("%d\n",peach(1));
return 0;
}请采纳。
#include
int N; //吃到N天还没吃时,剩1个,全局变量
int funn(int n)
{
if(n==N)
return 1;
else
return 2*funn(++n)+2;
}
int main()
{
int days,y;
printf("输入多少天后剩一个\n");
scanf("%d",&N);
for(days=1;days<=N;days++)
{
y=funn(days);
printf("days%d\t%d\n",days,y);
if(y<0)
{
printf("输入有误");//N<=30不会溢出
break;
}
}
}
10-5-1=4-2-1=1
#include
int n; //n作为全局变量int peach(int x) //表示第x天有几个桃子{ if(x < n) //如果x不是最后一天,那么这一天桃子的数量等于明天桃子数加1再乘以2 return 2*(peach(x+1) + 1); else if(x == n) //如果是最后一天,返回1 return 1; else return -1; //异常}int main(){ scanf("%d",&n); //输入题目中的n printf("%d\n",peach(1)); return 0;}请采纳。
C语言用递归算法,实现从键盘输入年月日,计算出是该年的第几天
#include
int fun(int year,int month,int day){int s=0,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};if(year%4==0&&year%100||year%400==0)a[2]=29;if(month==1) s+=day;else s+=a[month]+fun(year,month-1,day);return s;}void main(){int year,month,day;scanf("%d-%d-%d",&year,&month,&day);printf("%d年的第%d天",year,fun(year,month,day));}//运行示例:
编写用C语言实现的求n阶阶乘问题的递归算法
代码如下:
long int fact(int n)
{
int x;
long int y;
if(n<0)
{
printf(“error!”);
}
if(n==0)
return 1;
x=n-1;
y=fact(x);
return (n*y);
}
拓展阅读:
特点
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
要求
递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
C语言 递归算法 整数划分问题
#include
int stack[100];int top;int total,n;void dfs(int index){ int i; if(total==n) { printf("%d=",n); for(i=top-1;i>0;i--) printf("%d+",stack[i]); printf("%d\n",stack[0]); } if(total>n ) return ; for(i=n-1;i>=index;i--) { total+=i; stack[top++]=i; dfs(i); total-=i; stack[--top]; }}void main(){ while(scanf("%d",&n)!=EOF) { top=0; total=0; dfs(1); }}
c语言算n的阶乘的递归算法
#include
int fac(int n)
{
if(n < 0)
{
printf("error!\n");
return -1;
}
else if(n == 0)
return 1;
else
return fac(n- 1) * n;;
}
void main()
{
int n = 0;
printf("请输入n:");
scanf(%d",&n);
printf("%d的阶乘是%d",n,fac(n));
}
随手写的,没有编译,可能有小错误
int fn(n)
{
int y;
if(n<0){ printf("error");return -1;}
if(n==0) return 1;
else
{
y=fn(n-1)
return n*y;
}
}
思路:递归求阶乘函数,如果输入的参数等于1则返回1,否则返回n乘以该函数下次递归。
参考代码:
#include
int fun(int n){ if(n==1||n==0) return 1;//如果参数是0或者1返回1 return n*fun(n-1);//否则返回n和下次递归的积}int main(){ int n; scanf("%d",&n); printf("%d\n",fun(n)); return 0;}/*5120*/
C语言递归算法求1+2+3+....+n的和(不要百度答案…)
#include
int Sum(int n) { int sum = 0; if(n == 0) return 0; return n + Sum(n - 1);}int main() { printf("%d\n",Sum(100)); return 0;}
#include
float fun(int n)
{
if(n==1) return 1;//如果n=1则直接返回1
return n*fun(n-1);//否则返回n*fun(n-1),以此计算n的阶乘,这条语句就是递归体
}
void main()
{
int i;
float sum=0;
for(i=1;i<=n;i++){
sum+=fun(i); //循环调用,用sum累计
}
printf("sum=%.2f\n",sum);
}