首页 > 其他分享 >函数递归之青蛙跳台阶问题

函数递归之青蛙跳台阶问题

时间:2024-10-13 18:22:45浏览次数:3  
标签:return 递归 int 青蛙 frog times 跳法 台阶

一、题目:

一个青蛙一次只能向上跳一级或者跳两级台阶
问:这个青蛙跳上n级台阶有多少种跳法


二、解题:

分析:

我们将跳法的个数叫做F(n),不妨从n比较下的时候寻找一下规律

nF(n)
11
22
33
45
58
613
721

往下列举不难发现每一项都是其前面两项的和,所以这个问题就可以看作从第二项开始的斐波那契数列

那么为什么会这样呢?
想要跳到第n级台阶,无非就是从第n-1级台阶向上跳一级,或者从第n-2级台阶往上跳两级,即
F(n)=F(n-1)+F(n-2),以此类推,F(n-1)=F(n-2)+F(n-3)…直到n=1,2 F(1)=1,F(2)=2;
这就是函数的递归:当我们想要的到这个函数的结果时需要再次调用者函数。


代码的实现

int frog_times(int a)
{
	if (1 == a)
		return 1;
	if (2 == a)
		return 2;
	if (a > 2)
		return frog_times(a - 1) + frog_times(a - 2);
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("跳到第%d级台阶共有%d种跳法\n ", n, frog_times(n));
	return 0;
}

但是我们在运行较大的数时发现,同一个frog_times会被重复计算许多次
在这里插入图片描述
可以发现当n=40时F(3)被计算了39088169次!!!!这大大拖慢了程序的进程
实际上我们只需要计算一次F(3)即可,下面是优化的代码

int frog_times(int i)
{
	int a = 1;
	int b = 2;
	int c = 0;
	while (i > 2)
	{
		c = a + b;
		a = b;
		b = c;
		i--;
	}
	if (a == 1)
		return a;
	if (b == 2)
		return b;
	return c;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("跳到第%d级台阶共有%d种跳法\n ", n, frog_times(n));

	return 0;

}

在这里插入图片描述
在这里插入图片描述

标签:return,递归,int,青蛙,frog,times,跳法,台阶
From: https://blog.csdn.net/2403_87718362/article/details/142901232

相关文章

  • 递归——二叉树中的深搜
    文章目录计算布尔二叉树的值求根节点到叶节点数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径二叉树中的深搜有三种方法前序遍历根->左子树->右子树中序遍历左子树->根->右子树前序遍历左子树->右子树->根计算布尔二叉树的值......
  • 递归算法的时间复杂度(通过一道面试题来讲解)
    本篇通过一道简单的面试题,逐步分析递归算法的时间复杂度,最后找到最优解同一道题目,同样使用递归算法,既可以写出时间复杂度为O(n)的代码,也可以写出时间复杂度为O(logn)的代码。why?这是因为对递归算法的时间复杂度理解不够深入。下面通过一道面试题,来逐步分析递归算法的时间复......
  • 刷题计划 day12 二叉树(一)【定义】【递归遍历】【迭代遍历】
    ⚡刷题计划day12 二叉树(一)继续,这一小节主要是基础知识,但同样也是十分重要的,可以点个免费的赞哦~往期可看专栏,关注不迷路,您的支持是我的最大动力......
  • 递归特征消除(RFE)与随机森林回归模型的 MATLAB 实现
    在机器学习中,特征选择是提高模型性能的重要步骤。本文将详细探讨使用递归特征消除(RFE)结合随机森林回归模型的实现,以研究对股票收盘价影响的特征。我们将逐步分析代码并介绍相关的数学原理。1.数据准备首先,我们清空工作区并加载数据,假设最后一列是股票的收盘价,前面的列是特征......
  • 链表【两数相加】具体思路——【递归】【迭代】【暴力】(附完整代码)
    文章目录前言一、问题引入,如何理解【链表】两数相加?二、方法一(固定数组暴力)三、方法二(递归法)四、方法三(迭代法)前言本文将介绍【链表】两数相加对于这一问题将采用多种思路方法来解决【暴力】【递归法】【迭代法】一、问题引入,如何理解【链表】两数相加?题目链接......
  • 快速排序的非递归实现:借助栈实现、借助队列实现
    目录用栈实现快速排序1.用栈实现非递归快速排序的思路步骤1.1.思路步骤2.用栈实现非递归快速排序的代码3.用栈实现非递归快速排序的整个工程3.1.QuickSortNonR.h3.2.QuickSortNonR.c3.3.Stack.h3.4.Stack.c用队列实现非递归快速排序1.用队列实现非递归快速排序的思......
  • 详解二叉树的非递归遍历
    二叉树的非递归遍历:二叉树的非递归遍历使用栈或队列自身功能(先进后出或先进先出)来实现。对于非常深的树,递归可能导致栈溢出错误,因为每次递归调用都会占用栈空间。非递归遍历使用显式的栈或队列,可以更好地控制内存使用,避免这种问题。链表节点:classTreeNode{intv......
  • 编写一个程序递归判断一个字符串是否为回文。回文是指从前往后读和从后往前读都一样的
    defis_string_palindrome(string):iflen(string)<2:#设置出口returnTrueelse:#判断首末位是否相同ifstring[0]==string[len(string)-1]:#用列表来删除首末位相同字符list1=list(string)list1.pop(0)list1.pop()string=''.join(list1)#设置过程returnis_str......
  • 递归下降--自顶向下的解析方法
    递归下降(RecursiveDescentParsing)是一种自顶向下的解析方法,用于解析编程语言的语法或表达式。它通过使用一组递归的函数来处理文法规则(通常是上下文无关文法),从而将输入字符串解析为语法树或抽象语法树(AST)。递归下降解析器是手工编写的,因此可以根据具体需要灵活地控制解析行为......
  • C语言—函数递归
    目录一.递归的概念①递归的思想②递归的限制条件二.递归的一些典型例子①求n的阶乘②顺序打印一个整数的每一位③斐波那契数列三.递归与迭代一.递归的概念①递归的思想所谓递归,就是把一个大型复杂问题不断转化成一个个规模较小的子问题从而求解,直到子问题不能被......