C语言板块
c语言 递归VS2022环境何为递归递归就是解决问题的一种方法在c语言中递归就是函数自己调用自己。递归的限制条件1.递归满足这个限制条件时递归就会停止。2.每次递归都要越来越接近所限制的条件。递归的一些例题举例举例1.求n的阶乘想法0! 11! 12! 1* 23! 1* 2* 34! 1* 2* 3* 45! 1* 2* 3* 4* 5不难发现除0之外每一个数的阶乘都可以取前面一个数乘上自己。#define_CRT_SECURE_NO_WARNINGS1#includestdio.hintfac(intn){if(n0)return1;elsereturnfac(n-1)*n;}intmain(){intn0;scanf(%d,n);intrfac(n);printf(%d\n,r);return0;}举例2.顺序打印一个整数的每一位。问题我们可以很简单的将一个整数从个位开始打印打印到最高位先模10再除10而按顺序打印一个整数从最高位打印到个位我们无法判断其是几位数。想法此时我们就可以用递归的思想例如Print1234Print1234Print1234Print1234voidPrint(intn){if(n9){Print(n/10);}printf(%d ,n%10);}intmain(){intn0;scanf(%d,n);Print(n);return0;}举例3.求第n个斐波那契数。1 1 2 3 5 8想法所求的数是前两个数之和。intFib(intn){if(n2)return1;elsereturnFib(n-1)Fib(n-2);}intmain(){intn0;scanf(%d,n);intrFib(n);printf(%d,r);}由递归我们能够很轻易的得到我们所需要的答案但是他的效率低下为何效率低下我们可以看一下下面的程序。intcount0;intFib(intn){if(n3)count;if(n2)return1;elsereturnFib(n-1)Fib(n-2);}intmain(){intn0;scanf(%d,n);intrFib(n);printf(%d\n,r);printf(count%d,count);}由此可见当我们想计算第30个斐波那契的数的时候n3要整整算317811遍这无疑是十分的降低效率。所以有些时候递归并非最优解但其所需代码少易理解也是其优势。intFib(intn){inta1;intb1;intc0;while(n3){cab;ab;bc;n--;}returnc;}intmain(){intn0;scanf(%d,n);intrFib(n);printf(%d\n,r);}我们用迭代的方式就可以使其效率提高所以递归和迭代各有利弊。举例4.青蛙跳台阶问题规则总共有n级台阶青蛙可以一次跳一格或者两格问n级台阶有多少种跳法。想法刚开始我们可能毫无头绪但是我们可以倒着想当我们在第n个台阶的时候青蛙只有从n-1和n-2两个位置开始跳自然而然的就变成了斐波那契数列。intjump(intn){if(n2)return1;elsereturnjump(n-1)jump(n-2);}intmain(){intn0;scanf(%d,n);intrjump(n);printf(%d,r);}举例5.汉诺塔问题想法我们可以这样想将一根杆子上的盘子分成n-1和1做的每一次操作就是将最底下的1给挪到最终的位置重复操作将n-1再次切分这样就构成了递归的形式。#define_CRT_SECURE_NO_WARNINGS1#includestdio.hvoidmove(charpos1,charpos2){printf(%c-%c ,pos1,pos2);}voidHanoi(intn,charpos1,charpos2,charpos3){if(n1){move(pos1,pos3);}else{Hanoi(n-1,pos1,pos3,pos2);move(pos1,pos3);Hanoi(n-1,pos2,pos1,pos3);}}intmain(){intn0;scanf(%d,n);Hanoi(1,A,B,C);printf(\n);Hanoi(2,A,B,C);;printf(\n);Hanoi(n,A,B,C);return0;}其中Hanoi这块函数可以这么理解。voidHanoi(intn,charpos1,charpos2,charpos3){if(n1){move(pos1,pos3);}else{Hanoi(n-1,pos1,pos3,pos2);move(pos1,pos3);Hanoi(n-1,pos2,pos1,pos3);}}一开始在我们pos1位置处的盘子进行移动也就是进行递推让每一次递推都去接近我们所设置的限制条件就是n1。当pos1为一的时候就开始回归也是在此时开始打印我们所定义的这个函数。最后从这些题目可以看出递归可以很好的理解而且可以很方便的解决问题比迭代会方便一些。但是有些地方会效率低下所以要选择合适的方法去解决问题。以上是个人的想法如果有错误希望读者各位能够指出谢谢