1.求第n个斐波那契数。 2.编写一个函数实现n^k 3. 输入一个非负整数,返回组成它的数字之和4.将参数字符串中的字符反向排列 5.递归和非递归分别实现strlen6.递归和非递归分别实现求n

将以下所有功能集合在main函数中

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

2.编写一个函数实现n^k,使用递归实现

  1. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
    例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

  2. 编写一个函数 reverse_string(char * string)(递归实现)
    实现:将参数字符串中的字符反向排列。
    要求:不能使用C函数库中的字符串操作函数。

5.递归和非递归分别实现strlen
6.递归和非递归分别实现求n的阶乘
7.递归方式实现打印一个整数的每一位

#define   _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<string.h>

int fib1(int n) {     //递归实现斐波那契数 默认10
	if (n <= 2) {
		return 1;
	}
	return fib1(n - 2) + fib1(n - 1);//递归过程
}

int fib2(int n) {      //迭代实现输入斐波那契数,默认10
	int frist = 1;
	int second = 1;
	int third = 1;
	while (n > 2) {    //迭代过程
		n--;
		third = frist + second;
		frist = second;
		second = third;
	}
	return third;
}

int mul(int n,int k) {        //2.编写一个函数实现n^k,使用递归实现
	for (int i = 1; i < k; i++) {
		n *= n;
	}
	return n;
}

int ResolveNum(int n) {   //3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
	static int s=0;
	if (n >= 9) {
		return n % 10 + ResolveNum(n / 10);
	}
	return n % 10;
}

int reverse_string(char string[],int len) {  //4. 编写一个函数 reverse_string(char * string)(递归实现
	int left = 0;
	int right = len-1;
	while (left < right) {
		string[left] = string[left] ^ string[right];
		string[right] = string[left] ^ string[right];
		string[left] = string[left] ^ string[right];
		right--;
		left++;
		
	}
	return 0;
}

int MyStrlen(char arr[]) {      //非递归实现strlen
	int s = 0;
	while (arr[s] != '\0') {
		s++;
	}
	return s;
}

int MyStrlen2(char arr[]) {//5.递归分别实现strlen
	if (arr[0] == '\0') {
		return 0;
	}
	return 1+MyStrlen2(++arr);
}
int fac1(int n) {     //6.递归和非递归分别实现求n的阶乘
	if (1 == n) {
		return 1;
	}
	return n * fac1(n - 1);
}

int fac2(int n) {
	int s = 1;
	for (int i = 1; i <= n; i++) {
		s *= i;
	}
	return s;
}

int Myprintf(int n) {
	if (n > 9) {
		Myprintf(n / 10);
	}
	printf("%d ", n % 10);
	return 0;
}

int main(){
	//fib1(5);
	begain:
	printf("1.递归和非递归分别实现求第n个斐波那契数\n");
	printf("2.编写一个函数实现n^k,使用递归实现 \n");
	printf("3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和\n");
	printf("4. 编写一个函数 reverse_string(char * string)(递归实现) \n");
    printf("  实现:将参数字符串中的字符反向排列。\n");
	printf("  要求:不能使用C函数库中的字符串操作函数。\n");
	printf("5.递归和非递归分别实现strlen \n");
	printf("6.递归和非递归分别实现求n的阶乘\n");
	printf("7.递归方式实现打印一个整数的每一位\n");
	printf("请输入选择的功能:");
	int cs = 0;
	scanf("%d", &cs);
	switch (cs) {
	case 1: {              //1.递归和非递归分别实现求第n个斐波那契数
		printf("请输入需要查询的序号:");
			int n;
		scanf("%d", &n);
		printf("递归实现:%d\n", n);
		printf("迭代实现:%d\n", n);
	}
			break; 
	case 2: {          //2.编写一个函数实现n^k,使用递归实现
		printf("请输入底数:");
		int n;
		scanf("%d", &n);
		printf("请输入指数:");
		int k;
		scanf("%d", &k);
		printf("%d^%d=%d\n", n, k, mul(n, k));
	}
		break;
	case 3: {   //3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
		printf("请输入一个数:");
		int n = 0;
		scanf("%d", &n);
		printf("所得数字为:%d", ResolveNum(n));
	}
		break;
	case 4: {       //4. 编写一个函数 reverse_string(char * string)(递归实现)
				    //   实现:将参数字符串中的字符反向排列。
			        //   要求:不能使用C函数库中的字符串操作函数。
		char arr[] = "abcdef";
		int len=0;
		while (arr[len] != '\0') {
			len++;
		}
		reverse_string(arr, len);
		printf("%s\n", arr);
	}
		break;
	case 5: {         // 5.递归和非递归分别实现strlen
		char arr[] = "abcdefghtgfhfghfghfghfg";
		printf("非递归strlen:%d  \n", MyStrlen(arr));
		printf("递归Mystrlen:%d  \n", MyStrlen2(arr));
	}
		break; 
	case 6: {           //6.递归和非递归分别实现求n的阶乘
		printf("Please input a num:");
		int n;
		scanf("%d", &n);
			printf("递归the result is :%d\n", fac1(n));
			printf("非递归the result is :%d\n", fac2(n));
	}
		break;
	case 7: {            //7.递归方式实现打印一个整数的每一位
		int n;
		printf("Please input a num:");
		scanf("%d", &n);
		Myprintf(n);
	}
		break;
	default: {
		printf("###########输入错误,重新输入############");
		goto begain;  //重新输入
	}
		break;
	}

	system("pause");
}                                                                                                                                                                               
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值