函数递归应用
**关键字:**斐波那契数,strlen()以及求n阶乘的递归与非递归实现,递归与非递归的比较与个人总结
应用一:递归和非递归分别实现求第n个斐波那契数(F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*))
递归
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Fibonacci(int num)
{
if (num<=2)
{
return 1;
}
else
{
return Fibonacci(num - 2) + Fibonacci(num - 1);
}
}
int main()
{
printf("%d",Fibonacci(3));
return 0;
}
非递归实现求第n个斐波那契数
方法一:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr[10] = {1,1};
int len = sizeof(arr) / sizeof (arr[0]);
for (int i = 2; i < len; i++)
{
arr[i] = arr[i - 1] + arr[i - 2];
}
printf("第四个斐波那契数是%d",arr[3]);
return 0;
}
方法二:
#include<stdio.h>
int Fab(int n)
{
int f1 = 1;
int f2 = 1;
int f3 = 1;
for (int i = 3; i <= n; i++)
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
return f3;
}
int main()
{
printf("%d ", Fab(5));
return 0;
}
应用二:递归和非递归分别实现strlen()
递归实现strlen
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Strlen(char *string)
{
if (*string=='\0')
{
return 0;
}
else
{
int len = Strlen(string+1) + 1;
return len;
}
}
int main()
{
char arr[] = "abcde";
printf("%d\n",Strlen(arr));
return 0;
}
非递归实现strlen
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Strlen(char *string)
{
int len = 0;
while (*string)
{
len++;
string++;
}
return len;
}
int main()
{
char arr[] = "abcde";
printf("%d\n",Strlen(arr));
return 0;
}
应用三:递归和非递归分别实现求n的阶乘
递归实现n的阶乘
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int Mul(int num)
{
if (num == 1)
{
return 1;
}
else
{
return num*Mul(num - 1);
}
}
int main()
{
printf("%d\n", Mul(3));
return 0;
}
非递归实现n的阶乘
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Mul(int num)
{
int ret = 1;
for (int i = 1; i <= num; i++)
{
ret=ret*i;
}
printf("%d\n", ret);
}
int main()
{
Mul(3);
return 0;
}
比较与个人总结
递归代码条理清晰,易于理解,但是当递归次数变多时可能需要运行很久代码才能跑完,甚至会栈溢出
非递归代码不容易想出来,但是机器执行速度快,效率高,不会溢出
综上个人觉得代码还是尽量写非递归滴比较好一点