函数的递归调用

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

#include <stdio.h>
#include<stdlib.h>
int fab(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;
	if (n <= 2)
		return 1;
	while (n >2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}//非递归
int fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);
}//递归

int main()
{
	int x=0 ;
	scanf_s("%d\n", &x);
	printf("%d\n", fab(x));
	printf("%d\n", fib(x));
	system("pause");
}

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

#include <stdio.h>
#include<stdlib.h>
	int mi(int n,int k)
{
	if (k==0)
	return 1;
	 else if (k==1)
	return n;
	else 
	renturn mi( n,k-1)*mi(n,1);
	}
int main()
{
int x = 2;
int y = 3;
printf("%d\n",mi(x ,y));
system("pause");
}
  1. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,
    例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#include <stdio.h>
#include<stdlib.h>
int DigitSum(int n)
{
	if (n<10)
	return n;
	else if (n >= 10 && n<100)
	{
		int a = 0;
		int b = 0;
		a = n / 10 % 10;
		b = n % 10;
		return  a + b;
	}
	else
		return DigitSum(n / 10) + n % 10;
}
int main()
{
	int n = 1729;
	printf("%d\n",DigitSum(n));
	system("pause");
}
  1. 编写一个函数 reverse_string(char * string)(递归实现)
    实现:将参数字符串中的字符反向排列。
    要求:不能使用C函数库中的字符串操作函数。
#include <stdio.h>
#include<stdlib.h>
#include <stdio.h>
#include<stdlib.h>
char * reverse_string(char *p){
	int n = 0;
	char temp;
	char *q;
	q = p;
	while (*p != 0){
		n++;
		p++;
	}
	if (n > 1)
	{
		temp = q[0];
		q[0] = q[n - 1];
		q[n - 1] = '\0';
		reverse_string(q + 1);
		q[n - 1] = temp;
	}
	return q;
}

int main()
{
	char p[] = "abcd";
	printf("原字符串是:%s\n", p);
	printf("翻转后的字符串是:%s\n", reverse_string(p));
	system("pause");
	return 0;
}

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

#include <stdio.h>
#include<stdlib.h>
int longe(char *str)
{
int count = 0;
	while (*str != 0)
{
	count++;
	str++;
	}
	return count;
}
//非递归
int string(char*x)
{
	int count = 0;
    if (*x != 0)
{
	count = 1 + string(x+1);
}
	return  count;
}
int main()
{
	char a[] = "abcde";
	printf("%d\n", longe(a));
	printf("%d\n", string(a));
	system("pause");
}

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

#include <stdio.h>
#include<stdlib.h>
int fac(int n)
{
	int a = 1;
	if (n == 0)
		return 0;
	else if (n == 1)
		return 1;
	else
	
	for (int i = 1; i <= n; i++)
	{
	   a = a*i;
	}
	  return a;
}//非递归
int fac1(int n)
{
	if (n == 0)
		return 0;
	else if (n == 1)
		return 1;
	else
		return  n* fac(n - 1);
}//递归
int main()
{
	int n = 3;
	scanf_s("%d\n", &n);
	printf("%d\n", fac(n));
	printf("%d\n", fac1(n));
	system("pause");
	}

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

#include <stdio.h>
#include<stdlib.h>
int out(int n)
{
	if (n<10)
		printf("%d\n",n);
	else if (n >= 10)
	{
		out(n / 10);
		printf("%d\n", n % 10);
	}
}
int main()
{
    printf("请输入一个数\n");
	int a = 0;
	scanf_s("%d",&a);
     out(a);
	system("pause");
}
### C语言中函数递归调用的原理和使用方法 #### 一、递归调用的基本概念 递归是一种在函数内部调用自己的技术。这种机制使得复杂的任务可以通过将其分解为更小的子问题来解决,而这些问题的形式与原问题一致[^2]。递归的核心在于将一个问题逐步简化为基本情形(base case),直到可以直接求解为止。 #### 二、递归调用的工作原理 每当一个函数调用时,系统会在内存中的栈区为其分配一段空间以保存当前函数的状态信息,包括但不限于实际参数、形式参数以及局部变量等。对于递归函数而言,每一次自我调用都会重复这一过程,形成一个新的上下文环境独立于之前的各次调用[^4]。因此,即使同一个变量名可能出现在多次递归调用之中,但由于它们属于不同的活动记录(activation record),所以彼此互不影响。 重要的是要注意到任何递归都需要满足两个必要条件才能正常工作而不至于陷入无限循环或造成堆栈溢出等问题: 1. **基准情况(Base Case)**:这是停止进一步递归的地方,也就是最简单的情况可以直接得出答案无需再次调用自身。 2. **前进进展(Making Progress)**:确保每次递归都能朝着达到基准情况的方向迈进一步而不是停滞不前甚至倒退。 #### 三、经典示例分析 - 阶乘计算 下面给出利用递归来实现阶乘运算的一个典型例子及其解析: ```c #include <stdio.h> // 定义递归函数用于计算整数n的阶乘 long factorial(int n){ if (n == 0 || n == 1){ // 基准情况: 当输入为0或1时返回1 return 1; } else{ return n * factorial(n - 1); // 向下一层递归传递较小数值的同时累积结果 } } int main(){ int number = 5; long result; result = factorial(number); printf("Factorial of %d is %ld\n",number,result); return 0; } ``` 在此程序中,`factorial` 函数通过不断减少 `n` 的值并向更低层次发起新的实例化版本直至遇到基本情况 (`n=0 或者 n=1`) 来完成整个阶乘序列的构建[^5]。 #### 四、注意事项 尽管递归提供了优雅简洁的方式来表达某些算法逻辑,但也伴随着潜在的风险如性能开销较大、容易发生堆栈溢出等情况。所以在设计递归解决方案的时候应该特别留意以下几点: - 明确设定合理的基准状况避免无休止的递归; - 尽量优化递归路径降低不必要的冗余操作提升效率; - 对大规模数据处理场景考虑迭代替代方案防止因过深嵌套而导致失败。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值