递归算法实例C源码

合集下载

c语言写斐波那契数列使用递归和递推

c语言写斐波那契数列使用递归和递推

英文回答:As amon mathematical problem, the Fibonacci series is defined as follows: F(0) = 0, F(1) = 1, F(n) = F(n—1) + F(n—2)。

This means that the n element of the array is equal to the sum of its first two elements。

In the process of calculating the Fibonacci series, we should consider the way in which the regression and the extrapolation are carried out separately。

For government policymakers, understanding and using the formula of the Fibonacci series can help us to better understand and analyse the patterns of socio—economic development and provide an important reference for the development of science's paths, approaches and policies。

斐波那契数列作为一种常见的数学问题,其定义如下:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)。

这意味着数列的第n个元素等于其前两个元素之和。

在实现斐波那契数列的计算过程中,我们应当分别考虑递归和递推的方式。

对于政府决策者而言,理解并运用斐波那契数列的计算方法,能够帮助我们更好地理解和分析社会经济发展的规律,并为制定科学的发展路线、方针和政策提供重要参考。

c语言递归算法简单例子

c语言递归算法简单例子

c语言递归算法简单例子嘿,聊聊C 语言的递归算法简单例子,老有意思啦!嘿,朋友们!今天咱来唠唠C 语言里那个神奇又有点让人摸不着头脑的递归算法,顺便看几个简单例子,保证让你大开眼界!递归算法就像是一只调皮的小猴子,在代码的树林里上蹿下跳,一会儿钻进这个函数,一会儿又从里面冒出来,还带回一些东西,可有意思啦!比如说计算一个整数的阶乘,这可是递归算法的经典例子呢。

我们来看看代码怎么写:```cinclude <>int factorial(int n) {if (n == 0 n == 1) {return 1;} else {return n factorial(n - 1);}}int main() {int num = 5;int result = factorial(num);printf("%d 的阶乘是:%d\n", num, result);return 0;}```你看哈,在这个factorial 函数里,它自己会不断地叫自己,就好像一直在问:“嘿,我下一个数的阶乘是多少啊?”然后就一层一层地往里钻。

直到遇到n 等于0 或者1 这个底部,才开心地说:“哦,我知道啦,是1 呀!”然后又一层一层地跑回来,把每层得到的结果相乘,最后得出最终答案。

感觉就像是小猴子在树洞里找到了宝贝,然后欢天喜地地跑出来。

还有一个有趣的例子,就是计算斐波那契数列。

这斐波那契数列啊,前面两个数是0 和1,后面的每个数都是前两个数的和。

我们也可以用递归算法来算算。

```cinclude <>int fibonacci(int n) {if (n == 0) {return 0;} else if (n == 1) {return 1;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}int main() {int n = 10;for (int i = 0; i < n; i++) {printf("斐波那契数列第。

汉诺塔递归c语言

汉诺塔递归c语言

汉诺塔递归c语言
汉诺塔是一个经典的递归问题。

在汉诺塔问题中,有3个柱子,一个可以移动的盘子,开始时所有盘子按大小顺序叠放在第一个柱子上,目标是将这些盘子移动到第三个柱子上,同时每次只能移动一个盘子,并且不能将一个较大的盘子放在较小的盘子上面。

以下是一个使用C语言实现的汉诺塔递归算法:
c复制代码
#include<stdio.h>
void hanoi(int n, char from, char to, char via) {
if (n == 1) {
printf("Move disk 1 from %c to %c\n", from, to);
return;
}
hanoi(n - 1, from, via, to);
printf("Move disk %d from %c to %c\n", n, from, to);
hanoi(n - 1, via, to, from);
}
int main() {
int n = 3; // 盘子的数量
hanoi(n, 'A', 'C', 'B'); // 从柱子A移动到柱子C,经过柱子B
return0;
}
这个程序使用递归函数hanoi来解决汉诺塔问题。

当只有一个盘子时,直接将其从起始柱子移动到目标柱子。

当有多于一个盘子时,先将上面的n-1个盘子从起始柱子通过目标柱子移动到辅助柱子,然后将最大的盘子从起始柱子移动到目标柱子,最后将n-1个盘子从辅助柱子通过起始柱子移动到目标柱子。

递归算法(C版)

递归算法(C版)

【例4】用递归旳措施求斐波那契数列中旳第N个数
【参照程序】 #include<iostream> using namespace std; int a[11]; int fib(int); int main() { int m; cin>>m; cout<<"fib("<<m<<")="<<fib(m); }
//调用下一层递归
}
int main()
{
int n,k;
cin >> n >> k;
cout << s(n,k);
return 0;
}
【例6】数旳计数(Noip2023)
【问题描述】
我们要求找出具有下列性质数旳个数(涉及输入旳自然数n)。先输入一 种自然数n(n≤1000),然后对此自然数按照如下措施进行处理:
return(fac(n-1)+n);
//调用下一层递归
}
运营程序,当T=5时,输出成果:S=15,其递归调用执行过程是: (设T=3)
递归调用过程,实质上是不断调用过程或函数旳过程,因为递归调 用一次,全部子程序旳变量(局部变量、变参等)、地址在计算机内部 都有用特殊旳管理措施——栈(先进后出)来管理,一旦递归调用结束, 计算机便开始根据栈中存储旳地址返回各子程序变量旳值,并进行相应 操作。
int fib(int n) { if (n==0) return 0; if (n==1) return 1; return (fib(n-1)+fib(n-2)); }
输入 15 输出 fib(15)=610
//满足边界条件,递归返回 //满足边界条件,递归返回 //递归公式,进一步递归

c语言猴子吃桃问题递归法

c语言猴子吃桃问题递归法

c语言猴子吃桃问题递归法
"猴子吃桃"问题是一个经典的递归问题。

故事是这样的:猴子摘下了n个桃子,
第一天吃掉了桃子数的一半又多吃了一个,接下来的每一天也是吃前一天剩下的
一半再多吃一个,到了第m天就剩下一个桃子了。

下面是用C语言和递归方法
来解决这个问题。

```c
#include
<stdio.h>
int total_peaches(int n, int day) {
if (day == 1) {
return1; // 最后一天剩下一个桃子
} else {
return (total_peaches(n, day - 1) + 1) * 2; // 第二天桃子数是前一天加1后的两倍
}
}
int main() {
int n = 100; // 初始的桃子数
int day = 9; // 经过的天数,可以根据需要更改
printf("总共摘了 %d 个桃子\n", total_peaches(n, day));
return0;
}
这个程序会计算出猴子在经过指定的天数后总共摘了多少个桃子。

注意,递归的
终止条件是当只剩下一个桃子的时候,此时的天数(我们这里设定为1)。

在每
一天,桃子的数量是前一天加1后的两倍。

c语言递归求数列

c语言递归求数列

c语言递归求数列C语言递归求解数列是一种常见的编程问题,它可以通过递归函数来实现。

在数学中,数列是按照一定规律排列的一组数。

我们可以通过递归的方式来求解数列中的某一项或者整个数列。

首先,我们需要确定数列的规律,也就是递推关系。

递推关系是指数列中的每一项与前面的项之间的关系。

例如,斐波那契数列的递推关系是每一项等于前两项之和。

在C语言中,我们可以通过编写递归函数来实现数列的求解。

递归函数是指在函数体内调用自身的函数。

我们可以将递归函数看作是一个问题的解决方案,每次调用函数都是在解决一个更小规模的子问题。

下面是一个示例,演示了如何使用递归函数来求解斐波那契数列的第n项:```c#include<stdio.h>int fibonacci(int n) {// 递归终止条件if (n <= 1) {return n;}// 递归调用return fibonacci(n-1) + fibonacci(n-2);}int main() {int n;printf("请输入要求解的斐波那契数列的项数:");scanf("%d", &n);printf("斐波那契数列的第%d项为:%d\n", n,fibonacci(n));return 0;}```在上述代码中,我们定义了一个名为`fibonacci`的递归函数,它接受一个整数参数n,表示要求解的斐波那契数列的项数。

在递归函数内部,我们首先检查递归终止条件,即当n小于等于1时,直接返回n。

然后,我们通过递归调用函数本身来计算前两项的和,并返回结果。

在`main`函数中,我们首先获取用户输入的斐波那契数列的项数n,然后调用`fibonacci`函数来求解第n项,并将结果打印出来。

需要注意的是,递归函数在处理大规模问题时可能会导致性能问题,因为每次调用函数都需要保存现场和恢复现场。

C语言程序设计 递归应用举例

C语言程序设计 递归应用举例
printf(“逆向输出结果为:”) invertLongInt(iNumber);
return 0; }
void invertLongInt(long x) {
if(x >=0 && x <= 9) printf("%d\n" , x);
else { printf("%d" , x % 10);
invertLongInt(x / 10); } }
return 0; }
int gcd(int x , int y) {
if( x % y = = 0) return y;
else
return gcd(y , x % y); }
程序运行结果:
请输入两个整数:341,132 341 , 132 的最大公约数是 11
【例 7-8】反向输出一个长整数 程序设计思路: (1) 如果要输出的数据只有一位,则“反向输出”问题可简化为输出一位整数。 (2) 如果要输出的数据超过一位,则可将该整数分为两部分:个位上的数字和个位以前 的数字。个位上的数字可以直接输出,而个位以前的数字又可以看成一个新的整数,重复执 行“反向输出”的操作。这时,反向输出在规模上缩小了一位,但求解的方法还是一致的。 (3) 用表达式 x % 10 可以分离出一个整数个位上的数字,用表达式 x / 10 可以表示出 个位以前的数。定义一个反向输出函数 invertLongInt,每次先用 x % 10 计算并输出个位 上的数,然后用 x / 10(即个位以前的数)做参数调用自己,不断进行下去,直到只剩一 位数字。 参考程序如下:
/*程序名:7_8.c*/ /*功能:反向输出一个长整数 */ #include <stdio.h> void invertLongInt(long);

c语言递归调用例子

c语言递归调用例子

c语言递归调用例子【篇一:c语言递归调用例子】* 小编已将正确代码放在左侧任务的“不知道怎么办”里* 小编希望各位童鞋独立完成哦~*///定义一个函数,传送人员序号进去,返回该序号员工的年龄。

int getage(numpeople) //定义返回的年龄 int age; //如果是第1个人的时候,年龄为10岁 if(numpeople==1) age=10; //这是回推墙,也就是结束递归的条件。

else //还没接触到回推墙,就自我调用,谓之递归。

age = getage(numpeople-1) //年龄等于上一个人的年龄加2 return age;int main() printf( 第5个人的年龄是%d岁 , getage(5));return 0;}【篇二:c语言递归调用例子】一、基本内容:c语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。

要点:1、c语言函数可以递归调用。

2、可以通过直接或间接两种方式调用。

目前只讨论直接递归调用。

二、递归条件采用递归方法来解决问题,必须符合以下三个条件:1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。

说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用。

2、可以应用这个转化过程使问题得到解决。

说明:使用其他的办法比较麻烦或很难解决,而使用递归的方法可以很好地解决问题。

3、必定要有一个明确的结束递归的条件。

说明:一定要能够在适当的地方结束递归调用。

不然可能导致系统崩溃。

三、递归实例例:使用递归的方法求n!当n 1时,求n!的问题可以转化为n*(n-1)!的新问题。

比如n=5:第一部分:5*4*3*2*1 n*(n-1)!第二部分:4*3*2*1 (n-1)*(n-2)!第三部分:3*2*1 (n-2)(n-3)!第四部分:2*1 (n-3)(n-4)!第五部分:1 (n-5)! 5-5=0,得到值1,结束递归。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

玩转算法与数据结构之递归算法—HIT2000鲁天伟递归算法在数据结构的树,图程序中都有应用。

那么什么是递归算法呢。

其实就是函数的自我调用。

循环的在作一件事,把一个问题分成了可以重复的子问题去处理。

递归这个词有两层含义,即递去和归来。

递去,就是函数一层一层的在调用自己,我们在这里定义调用自己的函数为父函数,被调用的是子函数。

父与子是个相对概念(参照二叉树中父结点与子结点来理解)。

递去,何时结束呢,是要设定一个结束条件。

那么这种结束条件的设置,第一种是设全局变量,全局变量随着每次自我调用在变化,当全局变量达到指定值或是全局变量参与的计算达到某个指定的值时结束。

第二种是形参变量在被调用时达到指定值或形参参与的计算达到某个值时结束。

第三种是当不满足自我调用条件时结束。

这三种结束条件结合程序的需要可以组合使用。

归来是指调用到某一次时,子程序执行结束了,子函数一层一层的把程序的执行权返还给自己的父函数,父函数执行所调用子函数的下一条命令。

简单的递归,是一个函数体中调用自己一次,复杂的是在函数体中调用自己多次。

举一个字符串逆序输出的简单递归调用的例子如下图。

图表 1 递归函数调用1、字符串逆序输出问题:将一个长为4的字符串逆序输出。

代码如下:#include<stdio.h>#define MAXSIZE 4char data[MAXSIZE];Rverse(int n){if(n<MAXSIZE){Rverse(n+1);printf("%c",data[n]);}}void main(){printf("Input %d letters”,MAXSIZE);gets(data);Rverse(0);getch();}上面这段代码完成了,长度为4的任意字符串的逆序输出。

由于打印的语句在递归函数自我调用之后,所以打印是在归来时开始的,从后向前打印。

那如果把上面代码中标红的两句代码上下换个位置,那么就是正序打印了,也就是在递归函数自我调用之前打印,在递去的过程中打印。

递去过程中正序打印,归来过程中是逆序打印。

正序打印递归调用如下:Rverse(int n){if(n<MAXSIZE){printf("%c",data[n]);Rverse(n+1);}}修改成如下while循环代码Rverse(int n){while(n<MAXSIZE){printf("%c",data[n]);n=n+1;}}上述两段代码执行效果相同。

2、斐波那契级数问题求解F(n)=F(n-1)+F(n-2); n>=3,F(1)=1,F(2)=1 代码如下:#include<stdio.h>int Fib(int N){if(N<=1)return N;elsereturn Fib(N-1)+Fib(N-2);}int n;int result;do{printf("Input n ,if you want to quit please input -1\n"); scanf("%d",&n);if(n==-1)break;result=Fib(n);printf("Fib(%d) is %d\n",n,result);}while(1);getch();}3、阶乘问题:N!=N*(N-1)! 1!=1 代码如下:#include<stdio.h>int NJ(int n){if(n==1)return1;else{return n*NJ(n-1);}}void main(){int n;int result;do{printf("Input n you want to caculate n!,Input -1 to quit\n"); scanf("%d",&n);if(n==-1)break;result=NJ(n);printf("%d! is %d\n",n,result);}while(1);getch();}4、乘法运算:M*N=M*(N-1)N=1时返回M 代码如下:#include<stdio.h>int Multiply(int M,int N){if(N==1)return M;elsereturn M+Multiply(M,N-1);}int M,N;int a;int result;do{printf("Pleaese input the data you want to Multiply format:M N.Ifquit input -1 -1\n");scanf("%d %d",&M,&N);result=Multiply(M,N);if(M==-1)break;printf("%d * %d is %d\n",M,N,result);}while(1);getch();}5、组合的计算,从m个物品中选出n个物品有几种选法C n m=C n m-1+C n-1 m-1m>=n n>=0 #include<stdio.h>int zuhe(int m,int n){if(m==n || n==0)return1;elsereturn zuhe(m-1,n)+zuhe(m-1,n-1);}void main(){int m,n;int result;do{printf("Please input format:m n ;(m>=n) if you want to quit input -1 -1 \n");scanf("%d %d",&m,&n);if(m==-1)break;else if(m<n){continue;}else{result=zuhe(m,n);printf("C %d %d is %d\n",m,n,result);}}while(1);getch();}6、求两个数的最大公因数。

#include<stdio.h>int GCD(int M,int N){if(N==0)return M;elsereturn GCD(N,M%N);}void main(){int m,n;int result;do{printf("Please input M N format:M N,(M>=N)if you want to quit input -1 -1\n");scanf("%d %d",&m,&n);if(m==-1)break;if(m<n)continue;else{result=GCD(m,n);printf("Zui da gong yin zi is %d\n",result);}}while(1);getch();}7、汉诺塔问题,把n个圆盘,从A柱通过B柱全部移到C柱,圆盘在A柱上从上到下越来越大。

在移动的过程中,大圆盘不能放在小圆盘上。

图表 2 汉诺塔示意图#include<stdio.h>int count=0;void hanoi(int n,char a,char b,char c){if(n!=0){hanoi(n-1,a,c,b);count++;printf("step %d:Move %d %c->%c\n",count,n,a,c);hanoi(n-1,b,a,c);}}void main(){int n;do{count=0;printf("Please input n,if you want to quit,please input -1\n"); scanf("%d",&n);if(n==-1)break;elsehanoi(n,'A','B','C');}while(1);getch();}上述代码运行一下,对于n个圆盘的搬运,搬运的总次数是2n-1次。

8、迷宫问题,从指定的入口进,从指定的出口出。

代码实现如下:#include<stdio.h>int chess[7][7]={0,1,1,1,1,1,1,1,0,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,0,0,0,0,1,};int migong(int x,int y){if(x==6&& y==5){chess[x][y]=2;return1;}if(x<0|| x>6|| y<0|| y>6)else{if(chess[x][y]==0)/*0表示可以走*/chess[x][y]=2;/*用2标记已走过,避免走回头路*/elsereturn0;if(migong(x-1,y))return1;if(migong(x-1,y+1))return1;if(migong(x,y+1))return1;if(migong(x+1,y+1))return1;if(migong(x+1,y))return1;if(migong(x+1,y-1))return1;if(migong(x,y-1))return1;if(migong(x-1,y-1))return1;chess[x][y]=3;/*标3以后不再考虑这个位置,这个位置8面都不通*/return0;}}void main(){int i,j;migong(0,0);for(i=0;i<7;i++){for(j=0;j<7;j++){printf("%d ",chess[i][j]);}printf("\n");}getch();}9、N皇后问题,在一个N*N的棋盘上,放置N个皇后,使以每个皇后的为中心的八个方向上都没有其它皇后存在。

程序实现如下:#include<stdio.h>#define MAX 10char chess[MAX][MAX];/*===判断x行,y列这个位置是否能放皇后===*/int Place(int x,int y){int i,j;if(chess[x][y]=='Q') return0;j=y-1;while(j>=0){if(chess[x][j--]=='Q') return0;}j=y+1;while(j<MAX){if(chess[x][j++]=='Q') return0;}i=x-1;while(i>=0){if(chess[i--][y]=='Q') return0;}i=x+1;while(i<MAX){if(chess[i++][y]=='Q') return0;}i=x-1;j=y-1;while(i>=0&& j>=0){if(chess[i--][j--]=='Q') return0;}i=x+1;j=y-1;while(i<MAX && j>=0){if(chess[i++][j--]=='Q') return0;}i=x+1;j=y+1;while(i<MAX && j<MAX){if(chess[i++][j++]=='Q') return0;}i=x-1;j=y+1;while(i>=0&& j<MAX){if(chess[i--][j++]=='Q')return0;}return1;}int Queen(int x,int y,int N){int i,j;int result=0;chess[x][y]='Q';if(N==MAX)return1;else{for(i=0;i<MAX;i++){for(j=0;j<MAX;j++){if(Place(i,j)){result=Queen(i,j,N+1);if(result==1)return1;}}}chess[x][y]='X'; /*尝试了所有点,都无法再放一个皇后,这个位置不能放Q*/ return0;}}void main(){int i,j,x,y;do{for(i=0;i<MAX;i++){for(j=0;j<MAX;j++){chess[i][j]='X';}}printf("Input x,y you put Queen first.If you want to quit,please input -1 -1\n");scanf("%d %d",&x,&y);if(x==-1)break;else{Queen(x,y,1);for(i=0;i<MAX;i++){for(j=0;j<MAX;j++){printf("%c ",chess[i][j]);}printf("\n");}}}while(1);getch();}我自己使用的环境是运用notepad++编辑,在notepad++里调用Dev-CPP里的编译和运行。

相关文档
最新文档