递归和非递归

一、递归和非递归分别实现求第n个斐波那契数

斐波那契数:

亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。

接下来我们看看代码:

#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)
int fib1(int a)
{
	if (a <= 2)
	{
		return 1;
	}
	else
	{
		return (fib1(a - 1)+fib1(a - 2));
	}
}
int fib2(int a)     
{
	int i = 1;
	int j = 1;
	int k = 0;
	while (a> 2)
	{
		k = i + j;
		i = j;
		j = k;
		a--;
	}
	return k;
}
int main()
{ 
	int a;
	printf("please enter num:");
	scanf("%d", &a);
	printf("%d\n", fib1(a));//使用递归的方法实现
	printf("%d\n", fib2(a));//使用迭代的方法
	system("pause");
	return 0;
}

二、递归和非递归分别实现求n的阶乘 

int fib1(int a)
{
	if (a <= 1)
	{
		return 1;
	}
	else
	{
		return a*fib1(a - 1);
	}
}
int fib2(int a)
{
	int result = 1;
	while (a > 1)
	{
		result*= a;
		a-=1;
	}
	return result;
}
int main()
{ 
	int a;
	printf("please enter num:");
	scanf("%d", &a);
	printf("%d\n", fib1(a));//使用递归的方法实现
	printf("%d\n", fib2(a));//使用迭代的方法
	system("pause");
	return 0;
}

三、递归和非递归分别实现strlen 

int strlen(const char*p)
{
	
	if (*p == '\0')   //若为'\0'直接返回
	{
		return 0;
	}
	else               //否则就1+剩下的字符串长度
	{
		return 1 + strlen(p + 1);
	}
}
int strlen1(const char*p)
{
	int count = 0;
	while (*p!='\0')  //*p没有指向'\0'
	{
		count++;    //count++
		*p++;    //指针依次指向下一个
	}
	return count;
}
int main()
{
	char *p = "abdnce";
	printf("%d\n", strlen(p));  //递归
	printf("%d\n", strlen1(p)); //迭代
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分查找是一种常用的查找算法,可以在有序的数组中快速查找目标元素,其时间复杂度为 O(log n)。在实现二分查找时,可以采用递归非递归的方式。 递归实现二分查找的过程: 1. 如果 low > high,则表示查找失败,返回 -1。 2. 如果 low <= high,则计算 mid = low + (high - low) / 2,即中间位置的下标。 3. 如果 arr[mid] 等于目标元素 target,则直接返回 mid。 4. 如果 arr[mid] 大于目标元素 target,则在前半部分继续查找,即递归调用 binarySearch(arr, low, mid - 1, target)。 5. 如果 arr[mid] 小于目标元素 target,则在后半部分继续查找,即递归调用 binarySearch(arr, mid + 1, high, target)。 非递归实现二分查找的过程: 1. 如果 low > high,则表示查找失败,返回 -1。 2. 如果 low <= high,则计算 mid = low + (high - low) / 2,即中间位置的下标。 3. 如果 arr[mid] 等于目标元素 target,则直接返回 mid。 4. 如果 arr[mid] 大于目标元素 target,则在前半部分继续查找,即将 high 更新为 mid - 1。 5. 如果 arr[mid] 小于目标元素 target,则在后半部分继续查找,即将 low 更新为 mid + 1。 6. 重复步骤 1~5,直到找到目标元素或查找失败。 递归非递归实现的二分查找算法本质上是一样的,只是实现方式不同。相对而言,递归实现简单易懂,但由于递归调用可能会产生大量的函数调用开销,因此在处理大规模数据时,非递归实现更为高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值