数据结构与算法分析C语言版-第10章289页:将递归算法改为时间复杂度为O(n)的非递归算法

斐波那契数列两种算法的时间复杂度 这是2018王道数据结构考研复习指导的第一章思维拓展的题目。 关于斐波那契数列的简介:   斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应... 阅读详情
#include <iostream>
using namespace ::std;

double Eval( int N )  //递归方法
{
    int i;
    double Sum;

    if( N == 0 )
        return 1.0;
    else
    {
        Sum = 0.0;
        for( i = 0; i < N; i++ )
            Sum += Eval( i );
        return 2.0 * Sum / N + N;
    }
}

double iEval( int N ) //非递归方法
{
    int i;
    double Sum;
	double left, right;

    if( N == 0 )
        return 1.0;  //C0 = 1.0;
	else if( N == 1 )
		return 3.0;  //C1 = 3.0;
    else
    {
        Sum = 0.0;

		left = 3.0;  //左子节点
		right = 1;   //右子节点和
        for( i = 2; i <= N; i++ )
		{
			Sum = 2.0 * (left + right) / i + i;
			right = left + right; 
			left = Sum;
		}
        return Sum;
    }
}

int main()
{
	printf( "%f\n", Eval( 25 ) );
	printf( "%f\n", iEval( 25 ) );
	system( "PAUSE");
	return 0;
}

【王道思维扩展1】求解斐波那契数列的递归和非递归算法,并分析两种时间复杂度 求斐波那契数列的递归和非递归算法 阅读详情

相关推荐

C语言经典算法之二叉树的后序遍历(非递归实现)

在C语言中,二叉树的后序遍历(LRD顺序:左子树-右子树-根节点)非递归实现通常依赖于栈来模拟递归过程。

weixin_56154577的博客 1970

算法设计与问题求解(2)非递归程序时间复杂度分析

1确定关键操作 可以是赋值、比较、算数运算、逻辑运算、读写单个常量或单个变量等操作 也可以是 有常数个基本造作构成的程序块 2确定关键操作执行总的步数 一般属数列和的形式 3用O()表示 每次缩减一半 比如 N=16 上述程序块总共要 8 4 2 1 执行4次 是log2(16)=4 所以它的O是 O(log(N...

qq_39653453的博客 1532

高效遍历策略:非递归中序输出二叉树关键字的O(n)时间复杂度解决方案

在计算机科学中,二叉树是一种非常重要的数据结构,它在许多算法和应用中都扮演着核心角色。二叉树的遍历是其基本操作之一,而递归和非递归遍历是两种常见的遍历方法。递归遍历虽然直观易实现,但在某些情况下可能会导致栈溢出。因此,非递归遍历方法在处理大型数据结构时具有其独特的优势。本文将详细介绍如何使用一个栈作为辅助数据结构,实现一个O(n)时间复杂度的非递归遍历过程,以输出一个含有n个结点的二叉树中每个结点的关键字。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 1174

Java数据结构和算法(八)——递归

  记得小时候经常讲的一个故事:从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容是“从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,一天,老和尚给小和尚讲了一个故事,故事内容......”   什么是递归,上面的小故事就是一个明显的递归。以编程的角度来看,程序调用自身的编程技巧称为递归( recursion)。   百度百科中的解...

IT可乐 349

SAP-QM-质检操作

SAP-QM-质检操作

yanzibing99的博客 8176

Transformers在自动驾驶领域的应用(High-level like in scene)

Transformers uses global attention mechanism to capture long-range interaction information. Two core modules in Transformers are Self-Attention and Cross-Attention, which defined asAttn(Q,K,V)=softmax(QK⊤dk)VSelfAttn(X)=Attn(WQX,WKX,WVX)CrossAttn(X,Y)=Attn

qq_39337332的博客 1775

算法导论 习题12.1-3 二叉树的无栈非递归中序遍历算法

二叉树的中序遍历的无栈非递归算法中,需要解决的两个问题是: 1、判断子树是否已经遍历 2、从子节点回溯到父节点 要解决这两个问题可以在树的结点中增加两个数据:parent和isVisited,这样可以解决,但如果不添加新的数据结构,又如何解决呢? 可以在遍历树的结点之前将每个结点与其下一个遍历结点相关联起来,这种关联关系既可以用来回溯到父节点,也可以用来判断子树是否已经遍历。 直

程序缘 1853

J-Flash手动添加华大HC32F460型号全攻略

在嵌入式开发中,Flash编程算法是连接调试工具与微控制器的重要桥梁,它定义了芯片存储器的擦除、编程和校验等底层操作规范。其原理是通过调试接口将算法代码加载到目标芯片的RAM中执行,从而实现对Flash存储器的访问与控制。这项技术的核心价值在于打破了工具链对芯片型号的固有支持限制,使得开发者能够灵活适配各种新兴或定制化的微控制器。在工程实践中,当面对J-Link等主流调试器官方支持包更新滞后时,手动添加芯片型号成为保障开发效率的关键技能。本文以华大半导体的HC32F460系列MCU为例,详细解析了如何通过配

weixin_29192365的博客 349

算法导论:关于时间复杂T(n)的表达式处理

MIT算法导论提供了三种方法,不废话了,直接介绍: ( 公式显示不了,所有就截图了,请包涵~ 呵呵) 1.代换法:猜测-&gt; 验证 例如:T(n) = 4*T(n/2) + n ( 其中T(1) =O(1) ) 假设是时间复杂度是n^3 那么证明:那么设T(k) &lt;= c*k^3; 那么带入有:T(n) = 4*(n/2)^3 ...

jishublog 1447

神经元细胞结构刨析(持续更新)

神经细胞的学习笔记

weixin_46596227的博客 2220

Drools vs URule:5个真实项目场景告诉你如何选择开源规则引擎

本文通过电商风控、物流计费、会员体系、保险定价和物联网告警五个真实项目场景,深度对比了Drools与URule两款开源规则引擎。分析了两者在规则复杂度、性能表现、开发运维及适用场景上的核心差异,为技术选型提供基于实战的决策指南。

k6l7m8n9的博客 943

算法导论 10-2-7 时间为n的非递归过程,反转单链表

题目: 给出时间为n的非递归过程,反转单链表。

飞鸟 1073

边缘设备部署全攻略——ARM架构设备的OpenClaw优化(2026实测)

本文详细介绍了ARM架构设备上OpenClaw的部署与优化方案。针对边缘计算场景,文章系统分析了三类ARM设备:嵌入式设备(如Raspberry Pi 4、Jetson Nano)、工业设备(如BeagleBone、i.MX8M Plus)和服务器设备(如Marvell Armada、AWS Graviton3),并提供了详细的性能与功耗对比数据。在系统配置方面,重点推荐了Ubuntu ARM、Debian ARM和OpenWRT三种操作系统,包括内核版本、必备软件包和针对边缘环境的优化策略(如CPU频率调

博客 410

常见的算法时间复杂度计算分析-总结

如何计算时间复杂度: 非递归算法,通常是计算算法中循环的执行次数。那么就直接设该代码循环了k次 , 找出规模n与k的关系,得到k的级数趋近后的式子,既为时间复杂度。 2. 如果是递归算法,且只进行一次递归调用,有以一种方法是先求出深度depth,求出每一次执行的时间复杂度T ,总的时间复杂度就是depth * T(和用下面的方法原理是一样的。。) 如果递归比较复杂,那么套用递归算法的时...

wang__Ray的博客 1万+

多智能体系统在军事仿真中的应用:AI人工智能战略推演

本文旨在全面解析多智能体系统在军事仿真领域的应用技术,重点探讨AI驱动的战略推演系统的设计原理和实现方法。研究范围涵盖从基础理论到实际应用的完整技术栈。本文采用从理论到实践的递进结构,首先介绍核心概念,然后深入算法实现,最后展示实际应用案例和未来展望。多智能体系统(MAS):由多个相互作用的智能体组成的分布式系统军事仿真(Military Simulation):通过计算机模拟军事行动和战争场景战略推演(Strategic Wargaming):通过模拟推演评估军事战略的有效性更高保真度的仿真。

AI天才研究院 1777

FPGA电路设计1——芯片原理图和封装制作流程

本文详细介绍了FPGA电路板设计的学习过程,以Xilinx Kintex-7系列FPGA为例。主要内容包括:1)从官网下载芯片引脚分配文件的方法;2)原理图库绘制流程,重点讲解Bank划分(配置Bank、HR/HP IO Bank、高速收发器Bank)及利用Excel预处理数据;3)使用Altium Designer的Symbol Wizard工具实现引脚自动化导入;4)原理图设计要点,包括电源系统设计(多电压需求与上电时序)、配置电路(JTAG/Flash接口)和时钟设计。

在读研究生,FPGA电路设计与功能开发。 1383

利用斐波那契数列测试递归及非递归算法的时间复杂度(工具:VS2015、C++,赠送精确计算耗时的类代码)

利用斐波那契数列测试递归及非递归算法的时间复杂度(工具:VS2015、C++,赠送精确计算耗时的类代码) 业余时间看了些关于时间复杂度的资料,就想着根据资料写个代码测试一下,本人尚属菜鸟,欢迎各位看官提出宝贵意见及建议~ 1.在VS2015中新建Win32控制台应用程序 2.代码如下: // FibonacciSequence.cpp : 定义控制台应用程序的入口点。 // #include &amp;quot;...

weixin_43935474的博客 1457

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

递归法---实现 N 阶 Hanoi 塔问题的递归算法

本次实验通过实现N阶Hanoi塔问题的递归算法,深入探讨了递归思想的应用。Hanoi塔问题要求将N个盘子从源柱A移动到目标柱C,借助辅助柱B,且遵循每次只能移动一个盘子、大盘子不能放在小盘子上的规则。递归算法的核心思想是将问题分解为三个步骤:先将n-1个盘子从A移动到B,再将第n个盘子从A移动到C,最后将n-1个盘子从B移动到C。实验通过C代码验证了算法的正确性,并输出了N=4时的搬动过程。实验结果表明,Hanoi塔问题的最优解步数为2^n-1,时间复杂度为O(2^n)。

2402_87028704的博客 1005

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

非递归算法求解斐波那契数列

斐波那契数列可以使用非递归算法来求解,这样可以避免递归带来的性能问题,尤其是当 n 非常大时。在对比递归算法时,非递归算法的时间复杂度是显著更优的。递归算法在计算大的斐波那契数时会有大量的重复计算。这是使用非递归算法计算斐波那契数列的第 n 项,如果想获得前XX位斐波那契数列,在main函数里再写个for循环就好了,这里不再赘述。循环的次数是 n - 1(从 2 到 n),所以算法的时间复杂度是 O(n)。因此,对于计算斐波那契数列,非递归算法是一个更高效的选择,特别是在处理大数值时。

m0_60643914的博客 1386

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C语言实现斐波那切数列的递归与非递归两种算法

不同于递归算法,该算法不再从第n项入手,而是从第一项入手,通过前两项推出后项,并更新前两项以便继续后推,此时的n起到的作用也不再是索引,而是在我们的逻辑分析之下成为了循环次数结束的标志。从时间复杂度的角度来看,非递归算法明显更胜一筹。时间复杂度分析:每次递归调用时,我们都在做两次新的递归调用(n-1与n-2),因此整体上我们将执行约2^n次递归调用。即时间复杂度为O(2^n)。可以看到,递归算法几乎相当于把上图所示的“递归表达式”翻译了一遍,所以要想写好递归算法,可以先从数学上的递归表达式入手。

Rain_with_you的博客 1109

刷算法题?首先要学会基础的算法分析!(递归算法的数学分析和非递归算法的数学分析demo)

前言: 让我们一起来分析一个算法题目吧!

充满好奇的threecat 1615

【算法设计zxd】第2章 算法分析实例 递归非递归——交换,n阶乘,矩阵乘法,汉诺塔,二路归并,

非递归形式算法分析: 决定用哪些参数表示输入规模;  找出算法的核心操作,它通常位于算法的最内层循环中;  检查核心操作的执行次数是否只依赖于输入规模。如果 它还依赖于一些其他的特性,则可能需要对最差效率、 平均效率以及最优效率分别研究;  以式(2-1)的思想为核心,建立一个算法基本操作执行次 数的求和表达式;  利用求和运算标准公式和法则来建立一个操作次数的闭合公式,或者至少确定它的增长 次数。 非递归形式算法分析:  决定用哪些参数作为输入规模的度量标准.

iivan_cpp的博客 1676

汉诺塔的非递归算法

汉诺塔的非递归算法

m0_61973596的博客 1466

【快速幂算法】快速幂算法讲解及C语言实现(递归实现和非递归实现,附代码)

本文介绍了快速幂算法,并使用C语言分别以递归和非递归的形式实现了快速幂算法

lhr056813的博客 1366

斐波那契数列计算:数据结构与算法视角

通过对这段 C 语言代码的分析,我们可以看到递归和非递归两种方式在计算斐波那契数列第 n 项时的差异。递归算法虽然代码简洁,易于理解,但由于存在大量的重复计算,时间复杂度较高,且会占用较多的栈空间;而非递归算法通过迭代的方式,避免了重复计算,时间复杂度和空间复杂度都更优。在实际应用中,我们应该根据具体情况选择合适的算法,以提高程序的性能。同时,这个例子也让我们深刻体会到数据结构和算法对程序性能的重要影响。

CYR19Gin的博客 876

Hanoi塔问题的递归算法与非递归算法

1. 递归算法: n=1时,很简单只需要将编号为1的圆盘从A移动到B即可。 n>1时,只需要利用辅助塔C,先将n-1个较小的圆盘移动到C塔,再将剩下最大的圆盘移动到B塔,最后再将n-1个圆盘从C塔移动到B塔就可以了。 代码实现: def move(a,b): b.append(a.pop(-1)) return b def Hanoi(n,a,b,c): if n>0: Hanoi(n-1, a, c, b) b=move(a,b)

qq_45804668的博客 5384
上一篇: 两个数组A、B,求在A中出现而不在B中的数(求不相交集)
下一篇: 由内向外顺时针旋转队列&逆时针旋转队列
vshadow
博客等级 码龄18年 29粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值