c语言递归程序题(斐波那契数列递归/非递归,n的k次方递归/非递归,输入一个非负整数,返回组成它的数字之和递归,递归和非递归分别实现求n的阶乘,递归方式实现打印一个整数的每一位)

1.1 斐波那契数列递归实现(会产生非常多的重复计算)

int fib(int n) {
	if (n <= 2) {
		return 1;
	}
	else {
		return fib(n - 1) + fib(n - 2);
	}
}
int main() {
	int n = 0;
	scanf("%d", &n);
	printf("%d",fib(n));
}


1.2 斐波那契数列非递归实现(效率高)

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987…
//规律——除了第一个第二个,其他的数都是通过前面两个数相加得到的结果

int fib(int n) {
	int first = 1;
	int second = 1;
	int third = 1;
	if (n <= 2) {
		return n;
	}
	while (n-2) {
		third = first + second;
		first = second;
		second = third;
		n--;//必须加
	}
	return third;
}
int main() {
	int n = 0;
	scanf("%d", &n);
	printf("%d",fib(n));
}


2.1 编写一个函数实现n的k次方递归实现。

需要区分三种情况>0,=0,<0

float my_pow(int n, int k) {
	if (k == 0) {
		return 1;
	}
	else if (k > 0) {
		return n * my_pow(n, k - 1);
	}
	else if (k < 0) {
		return 1.0/my_pow(n, -k);
		//这里巧妙的将<0的运算转换为了>0运算
	}
}
int main() {
	int n = 0;
	int k = 0;
	scanf("%d %d", &n, &k);
	float j=my_pow(n, k);
	printf("%f", j);
}


2.2 编写一个函数实现n的k次方非递归实现。

float my_pow(int n, int k) {
	if (k == 0) {
		return 1;
	}
	else if (k > 0) {
		float sum = 1;
		for (int i = 0; i < k; i++) {
			sum *= n;
		}
		return sum;
	}
	else if (k < 0) {
		k = -k;//必须先取正,当成正数算,最后取倒数
		float sum = 1;
		for (int i = 0; i < k; i++) {
			sum *= n;
		}
		return 1.0/sum;//两者想除得有一个小数
	}
}
int main() {
	int n = 0;
	int k = 0;
	scanf("%d %d", &n, &k);
	float j=my_pow(n, k);
	printf("%f", j);
}

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

int DigitSum(int n) {
	if (n > 9) {
		return n % 10 + DigitSum(n / 10);
	}
}
int main() {
	int n = 0;
	scanf("%d", &n);
	printf("%d",DigitSum(n));
	return 0;
}


3.1 求n的阶乘递归实现(不考虑溢出的问题)

int factorial(int n) {
	if (n <= 1) {
		return 1;
	}
	else {
		return n * factorial(n - 1);
	}
}
int main() {
	int n = 0;
	scanf("%d", &n);
	printf("%d", factorial(n));//1*2*3*4*5*6*7*8*9
	return 0;

}

3.2 求n的阶乘递归实现(不考虑溢出的问题)

int factorial(int n) {
	int sum = 1;
	for (int i = 1; i <= n; i++) {
		sum *= i;
	}
	return sum;
}
int main() {
	int n = 0;
	scanf("%d", &n);
	printf("%d",factorial(n));//1*2*3*4*5*6*7*8*9
	return 0;

}

​

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

void my_printf(int n) {
	if (n > 9)//限制条件
		my_printf(n / 10);//(n/10)使其逐渐接近(n>9)这个限制条件
	printf("%d ", n % 10);
}
int main() {
	int n = 0;
	scanf("%d", &n);
	my_printf(n);
	return 0;

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值