C语言练习7

本文深入探讨了递归与非递归算法在多种典型问题中的应用,包括斐波那契数列、幂运算、数字求和、字符串反转、字符串长度计算、阶乘计算及整数位打印。通过对比两种方法,展示了它们各自的优缺点和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int fibonacci(int n){

	if(n==1 || n==2){
		return 1;
	}
	return fibonacci(n - 1) + fibonacci(n - 2);
}
int Fibonacci(int n){
	int f1 = 1;
	int f2 = 1;
	int f3 = 0;
	int i = 0;
	for(i = 3;i <= n;i++){
		f3 = f1+f2;
		f1 = f2;
		f2 = f3;
	}
	return f3;
}
int main(){
	int n=0;
	printf("请输入n:");
	scanf("%d", &n);
	int ret = fibonacci(n);
	printf("%d\n",ret);
	system("pause");
	return 0;
}

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdlib.h>

int Pow(int n,int k){
	if (k == 0){
		return 1;
	}
	return n*Pow(n,k-1);
}
int main(){
	int n = 0;
	int k = 0;
	int ret = 0;
	printf("请输入n k:");
	scanf("%d %d", &n,&k );
	ret = Pow(n,k);
	printf("%d\n",ret);
	system("pause");
	return 0;
}
  1. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
    例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int DigitSum(unsigned int num){//无符号 unsingned int
	if (num > 9){//多位数
		return DigitSum(num / 10) + num%10;
	}
	return num;
}
int main(){
	int n = 0;
	int ret = 0;
	printf("请输入一个数字:");
	scanf("%d", &n);
	printf("\n");
	ret=DigitSum(n);
	printf("%d \n", ret);
	system("pause");
	return 0;
}
  1. 编写一个函数 reverse_string(char * string)(递归实现)
    实现:将参数字符串中的字符反向排列。
    要求:不能使用C函数库中的字符串操作函数。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

char* reverse_string(char* str){
	int len = strlen(str);
	if (len > 1) {
		char temp;
		temp = str[0];
		str[0] = str[len - 1];
		str[len - 1] = '\0';
		reverse_string(str + 1);
		str[len - 1] = temp;
	}
	return str;
}
int main(){
	char str[10] = { 0 };
	char ch;
	printf("请输入一个字符串(10个字符以内,以换行符终止):");
	for (int i = 0; i < 10; i++) {
		if ((ch = getchar()) != '\n') {
			str[i] = ch;
			continue;
		}
		break;
	}
	printf("字符串元素为:\t");
	puts(str);
	reverse_string(str);
	printf("倒序输出为:\t");
	puts(str);
	system("pause");
	return 0;
}

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

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>

int Strlen(char* n){
	int count = 0;
	while (*n != '\0'){
		count++;
		*n++;
	}return count;
}
int MyStrlen(char *n){
	if (*n == '\0')
	{
		return 0;
	}
	return 1 + MyStrlen(n + 1);
}
int main(){
	char n[] = { 0 };
	int ret = 0;
	printf("请输入字符串:");
	scanf("%s", n);
	ret = MyStrlen(n );
	printf("%d\n", ret);
	system("pause");
	return 0;
}

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

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
int Factorial(int n){
	if (n != 1){
		return Factorial(n -1)*n;
	}
	return 1;
	
}

int main(){
	int i = 0;
	int ret = 1;
	int result = 1;
	int n = 0;
	printf("请输入n:");
	scanf("%d", &n);
	result = Factorial(n);
	printf("%d\n", result);
	for (int i = 1; i <= n; i++){
		ret = ret*i;
	}
	printf("%d\n", ret);
	system("pause");
	return 0;
}

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

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

void PrintNum(unsigned int num){//无符号 unsingned int
	if (num > 9){//多位数
		PrintNum(num / 10);
	}
	printf("%d ", num % 10);
}
void print(int num){

	if (num != 0){
		printf("%d", num%10);
		num=num / 10;
	}

}
int main(){
	int num = 0;
	printf("请输入一个数字:");
	scanf("%d", &num);
	printf("\n");
	PrintNum(num);
	print(num);

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值