函数递归应用

函数递归应用

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

比较与个人总结

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值