函数递归应用

函数递归应用

**关键字:**斐波那契数,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;
}

比较与个人总结

递归代码条理清晰,易于理解,但是当递归次数变多时可能需要运行很久代码才能跑完,甚至会栈溢出
非递归代码不容易想出来,但是机器执行速度快,效率高,不会溢出
综上个人觉得代码还是尽量写非递归滴比较好一点
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43360037/article/details/100674000