博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
递归和非递归
阅读量:3943 次
发布时间:2019-05-24

本文共 3272 字,大约阅读时间需要 10 分钟。

1、递归就是函数调用函数本身,运行起来就是函数嵌套函数,层层嵌套,所以函数调用、参数堆栈都是不小的开销,但是程序简单。

2、非递归就是不断地对参数入栈、出栈,省去了函数层层展开、层层调用的开销。虽然参数出入栈次数多了,但是一般都开辟固定的足够大的内存来一次性开辟、重复使用。
3、非递归是从堆栈的角度来编写程序,速度快,但代码复杂。
递归是从问题本身的逻辑角度来编写,虽然速度相对慢,但代码容易理解。

对于同一个问题,如果对速度要求不高,建议用递归方式。

  • 递归和非递归分别实现求第n个斐波那契数。
  • 递归和非递归分别实现strlen
  • 递归和非递归分别实现求n的阶乘
  • 递归实现n^k
  • 递归方式实现打印一个整数的每一位
  • 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和(例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 )
  • 编写一个函数 reverse_string(char * string)(递归实现)
    实现:将参数字符串中的字符反向排列。
    要求:不能使用C函数库中的字符串操作函数。

1.递归和非递归分别实现求第n个斐波那契数

首先对于斐波那契数序列:1 1 2 3 5 8 13 21 34… 从第三项开始,每一项都等于前两项之和。

int count = 0;   //计数计算多少次f1int Fabonaci(int n)  //递归{	if (n == 1 || n == 2)	{		count++;   //count计数,体会递归的耗时		return 1;	}	else	{		return Fabonaci(n - 1) + Fabonaci(n - 2);  //第n个数的斐波那契等于前两个之和 问题不断化小	}}int main(){	printf("%d\n", Fabonaci(5));	printf("计算%d次f1\n",count);	system("pause");	return 0;}
int Fabonaci(int n) //非递归{	int f1 = 1;	int f2 = 1;	int f3 = 0;	int i = 0;	for (i = 3; i <= n; i++)	{		f3 = f2 + f1;  //1(f1) 1(f2) 2(f3)  3  5		f1 = f2;  		f2 = f3;       //1(f1) 2(f2)  3 (f3)  5	}	return f3;}int main(){	printf("%d\n", Fabonaci(10));	system("pause");	return 0;}

2.递归和非递归分别实现strlen

strlen遇到\0停止,引用数组引进头文件<string.h> ,字符串的长度就是字符个数。

#include
int count = 0;int MyStrlen1(char *str) //非递归{ //int count = 0; assert(str != NULL); //断言str传进来不为空 while (*str != '\0') { count++; str++; } return count;}int main(){ char str[] = "abcdef"; printf("%s\n", str); MyStrlen1(str); printf("%d\n", count); system("pause"); return 0;}
int MyStrlen(char *str)  //递归{	if (*str == '\0')	{		return 0;	}	else	{		return 1 + MyStrlen(str + 1);	}}int main(){	char  str[] = "abcdef";// *str = "abcdef";	int len = MyStrlen(str);	printf("%d\n", len);	system("pause");	return 0;}

3.递归和非递归分别实现求n的阶乘

int Fac(int n)//5! = 5*4!   5*4*3!{	if (n == 1)	{		return 1;	}	else	{		return n*Fac(n - 1);	}}int main(){	printf("%d", Fac(5));	system("pause");	return 0;}

4.递归实现n^k

int MyPow(int n, int k)  //递归{	if (k == 0)	{		return 1;	}	else	{		return n*MyPow(n, k - 1);   //n*n^k-1 = n^k	}}int main(){	int res = MyPow(5,3);	printf("%d\n",res);	system("pause");	return 0;}

5.递归方式实现打印一个整数的每一位

void print(int n)   //123   {	if (n > 9)	{		print(n / 10);	}	printf("%d ", n % 10);}int main(){	print(123);	system("pause");	return 0;}

6 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

int DigitSum(int n){	if (n < 10)	{		return n;	}	else//14   123	{		return DigitSum(n / 10) + n % 10;	}}int main(){	int res = DigitSum(1729);	printf("%d\n",res);	system("pause");	return 0;}

递归的过程是***先递后归*** 1729 172 17 1为递过程 ; 1 7 2 9为归过程

7.编写一个函数 reverse_string(char * string)(递归实现)

void reverse_string(char *p) //递归{	int len = strlen(p);     //不包括\0	char tmp = *p;	*p = *(p + len - 1);   	*(p + len - 1) = '\0';    //保证字符串长度不变	if (strlen(p + 1) > 1)	{		reverse_string(p + 1);	}	*(p + len - 1) = tmp;    // *p 和 *(p+len-1) 进行交换}int main(){	char str[] = "abcdef";	printf("%s\n", str);	reverse_string(str);	printf("%s\n", str);	system("pause");	return 0;}
void reverse_string(char *str) //非递归{	char *left = str;	char *right = str + strlen(str) - 1;	while (left < right)	{		char tmp = *left;		*left = *right;		*right = tmp;   //交换		left++;		right--;	}}int main(){	char str[] = "abcdef";	printf("%s\n", str);	reverse_string(str);	printf("%s\n", str);	system("pause");	return 0;}

转载地址:http://crjwi.baihongyu.com/

你可能感兴趣的文章
QT 开发问题合集
查看>>
Github使用问题合集
查看>>
QT多线程服务器
查看>>
Ubuntu 18.04.2 ulimit配置
查看>>
Ubuntu Mysql 安装与配置
查看>>
QT5.12 Mysql驱动未能加载问题
查看>>
现场直击|SequoiaDB@SIGMOD 2021:关注数据库的根科技存储技术
查看>>
赋能政企智慧办公,巨杉数据库与致远互联完成产品互认证
查看>>
SequoiaDB湖仓一体架构亮相 ACM SIGMOD 2021
查看>>
信通院发布第十二批大数据产品能力评测结果,巨杉数据库两款产品通过
查看>>
巨杉数据库荣获2020年度河南省科学技术进步奖
查看>>
湖仓一体提升管理效率 培育数据沃土
查看>>
报名启动!巨杉数据库 2021 湖仓一体技术大赛带你进入分布式技术的星辰大海
查看>>
H2数据库用户自定义函数方法及范例
查看>>
关于系统中使用多个PropertyPlaceholderConfigurer的配置
查看>>
厦大06应用金融硕士研究生推荐精读书目
查看>>
《越人歌》-诗经
查看>>
Jetty嵌入式服务器的JNDI快速配置指南
查看>>
夜, 北京
查看>>
图示ExtJS商业智能的仪表盘配置系统 - (Season 1)
查看>>