递归、斐波那契数、strlen的实现和青蛙跳台阶

本文探讨了递归与非递归两种编程方法在斐波那契数列、字符串长度计算及青蛙跳台阶问题中的应用。通过对比,强调了递归的简洁性和非递归的效率优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归

递归的两个条件:
1、调用自己本身
2、有一个趋于终止的条件
但是需要注意,递归的调用是在栈上执行(需要注意溢出的问题)

斐波那契数

指的是这样一个数列:1、1、2、3、5、8、13、21、……,斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。
非递归的方法:

#include<stdio.h>

//斐波那契数,非递归

int Fib(int n)
{
	int f1 = 1;
	int f2 = 1;
	int f3 = 1;			//保证第一个数是1
	int i = 0;
	for(i = 3;i <= n;i++)
	{
		f3 = f1+f2;
		f1 = f2;
		f2 = f3;
	}
	return f3;
}
int main()
{
	int input = 0;
	scanf_s("%d", &input);
	printf("第%d个斐波那契数是%d\n",input,Fib(input));
}

递归实现

#include<stdio.h>

//斐波那契数,递归方式

int Fib(int num)
{
	if (num <= 2)
	{
		return 1;
	}
	else
	{
		int sum = Fib(num - 1) + Fib(num - 2);
		return sum;
	}
}
int main()
{
	int input = 0;
	scanf_s("%d", &input);
	printf("第%d个斐波那契数是%d\n", input, Fib(input));
}

求斐波那契数虽然可以用递归来实现,但其实一般不用递归,递归的计算量太大,时间太长,且很容易造成栈的溢出;所以一般用循环的方式实现

Strlen的实现

strlen是用来求字符串长度的,来实现一下strlen的内部代码
非递归:

#include<stdio.h>

//求字符串长度strlen,非递归

int instrlen(char* string)
{
	int count = 0;
	while (*string != '\0')
	{
		count++;
		*string++;
	}
	return count;
}
int main()
{
	char* string = "HelloWorld";
	printf("%d\n", instrlen(string));
}

递归的方法:

#include<stdio.h>

//求字符串长度strlen,递归

int instrlen(char* string)
{
	if (*string == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + instrlen(string + 1);
	}
}
int main()
{
	char* string = "HelloWorld";
	printf("%d\n", instrlen(string));
}

青蛙跳台阶问题

问题:一只青蛙一次可以跳上一级台阶,一次也可以跳上两级台阶,问跳上n级台阶有几种跳法?
分析:只有一级台阶,有一种跳法;有两级台阶,有两种跳法;有三级台阶,有三种跳法;有四级台阶,有5种跳法…
得到从两级台阶之后,n级台阶的跳法=(n-1)级台阶的跳法+(n-2)级台阶的跳法
便可以使用递归的思想来实现

#include<stdio.h>
int JumpFloor(int input)
{
    if(n==1)
    {
        return 1;
    }else if(n==2)
    {
        return 2;
    }
    return JumpFloor(n-1)+JumpFloor(n-2);
}
int main()
{
    printf("%d\n",Jumpfloor(3));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值