本文主要列举了C语言函数递归的几个简单示例,包括打印一个整数的每一位,N的阶乘,strlen的模拟,计算一个数的每位之和,字符串逆序,计算斐波那契数,实现n的k次方;对个别示例还给出非递归方法,以判断递归的优劣势。
1. 函数递归概念
程序调用自身的编程技巧称为递归 。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,可以把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
2.两个必要条件
(1)要有限制条件;
(2)每次调用都会向限制条件靠近;
3.简单案例
(1)递归实现打印一个整数的每一位
int pr (int a)
{
if (a > 9)
{
pr(a / 10);
}
printf("%d " , a%10);
}
int main()
{
int num = 1234;
pr(num);
return 0;
}
通过取余的方式去掉整数的最高位,用除10输出的每一位。
(2)N的阶乘(不考虑溢出的情况下)
int jc(int b)
{
if (b < 1)
{
return 1;
}
else
{
return b * jc(b - 1);
}
}
int main()
{
int a = 5;
int d = jc(a);
printf("%d的阶乘:%d",a,d);
return 0;
}
对比N的阶乘非递归方式
/*
从1乘到N
*/
long long Fac(int N)
{
long long ret = 1;
for(int i = 2; i <= N; ++i)
{
ret *= i;
}
return ret;
}
(3)strlen的模拟
int strrlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + strrlen(str + 1);
}
int main()
{
char* p = "abcde";
int len = strrlen(p);
printf("字符串长度为%d\n", len);
return 0;
}
对比strlen的模拟非递归方式(设置计数器,用来统计有效字符的个数)
int my_strlen(char* str)
{
int count = 0;
while('\0' != *str)
{
count++;
str++;
}
return count;
}
(4)计算一个数的每位之和
int sum (int a)
{
if (a > 9)
{
return sum(a / 10) + a % 10;
}
return a ;
}
int main()
{
int num = 1234;
int sum1 = sum(num);
printf("每位之和为:%d",sum1);
return 0;
}
(5)字符串逆序(递归实现)
int reverse(char* a)
{
char tmp;
int len = strlen(a);
if (len > 1)
{
tmp = *a;
*a = *(a + len - 1);
*(a + len - 1) = '\0'; // \0也要前移补位,切勿忘记。
reverse(a + 1);
*(a + len - 1) = tmp;
}
}
int main()
{
char arr[] = "ABCDEF";
reverse(arr);
printf("%s", arr);
}
(6)递归实现n的k次方
int ex(int n, int k)
{
if (1 < k)
return n * ex(n, k - 1);
else
return n;
}
int main()
{
int a, b;
printf("底数:");
scanf("%d",&a);
printf("次数:");
scanf("%d", &b);
int c = ex(a, b);
printf("%d的%d次方是%d",a ,b, c);
}
(7)计算斐波那契数(递归及非递归方法对比)
int fib(int a) //递归
{
if (a > 2)
{
return fib(a - 1) + fib(a - 2);
}
else
return 1;
}
int fib2(int b) //非递归
{
int num1 = 1;
int num2 = 1;
int newnum = 1;
while (2 < b)
{
newnum = num1 + num2;
num1 = num2;
num2 = newnum;
b--;
}
return newnum;
}
int main()
{
int n;
printf("第几个斐波那契数:");
scanf("%d",&n);
int f = fib(n);
int g = fib2(n);
printf("第%d个斐波那契数是%d(递归)\n",n,f);
printf("第%d个斐波那契数是%d(非递归)\n", n, g);
return 0;
}
值此新春佳节,祝大家新春快乐!这也是我的第一篇博客,希望新的一年里能实现自己的目标!