简单谈谈 C/C++ 递归的思想,实现,以及和循环的关系。

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的。编程是解决问题的,而现实中很多的问题都是比较简单的,没有象汉诺塔那么复杂。我们也不必追究递归到底是怎样实现的,我们只是要会用递归,会用递归来为我们解决一些问题,这就行了。
        首先来看一个例子:

有一个Febonacci序列:

        1,1,2,3,5,8,13,,21,34........

它的问题是:求这个序列中的第N个数。

由于它的函数原形是:f(n)=f(n-1)+f(n-2)

这用递归很容易就可以写出代码来,一点都不费事:

 

 

 

噢~~~~~也许你会说递归真是太简单了,简直就是一个数学模型嘛,呵呵。

其实,递归函数的工作过程就是自己调用自己。有一些问题用递归就很容易解决,简单的你自己都会吃惊。

        我们做事情,一般都是从头开始的,而递归却是从末尾开始的。比如上面的函数吧,当n>3时,它显然只能求助于n-1,n-2。而(n-1)>2,(n-2)>2时,它们就求助于:(n-1)-1,(n-1)-2;(n-2)-1,(n-2)-2;然后··············直到(n-k)<3,(n-k-1)<3时,函数Febc终于有了返回值1 了,它再从头开始计算,然后一直算到n 为止。

       通过上面的例子,我们知道递归一定要有一个停止的条件,否则递归就不知道停止了。在上面的例子中,     if(n<3)  return (1); 就是停止的条件。

      然而,使用递归的代价是十分巨大的:它会消耗大量的内存!!递归循环时它用的是堆栈,而堆栈的资源是十分有限的。上面的例子你只能用一个很小的n值。如果n=20,即Febc(20)的话,它将调用Febc(n)函数10000多次!!!而上面一个例子用循环也是十分容易写的:

 

有兴趣者不妨输入一个较大的n值,然后比较比较这二个函数计算的速度。当然, 如果你使用的n太大的话,递归可能发生错误。如果死机了可别骂我哦~~~ 我已经提醒过你了 :)

      现在我们再来看看一个求从1 加到100的循环:

 

        这很简单没什么可说的。 但是,你能不能写出相应的递归函数呢?

        下面就是递归(请注意了,这种做法不推荐!! 我只是为了说明问题才这么写的。)

 

 

 在C/C++的问题中,我曾经回答过这样的一个问题:

若一头小母牛,从出生起第四个年头开始每年生一头母牛,按此规律,第n年时有多少头母牛? 请问如何用递归涵数求此问题?

先写出函数表达式:

f(n)=f(n-1)+f(n-3)

为什么f(n)=f(n-1)+f(n-3)呢,请看:
f(n)-f(n-1)=f(n-3)
因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。(请用BorlandC++3.1或其他C++编译器)

 
        怎么样,很简单吧。 会用循环求解吗?

        递归在实际的编程中并不常用,但是在某些情况下,它是非常强有力而漂亮的工具。掌握它的原理时会十分有用的。

 

初学者看过来:简单谈谈 C/C++ 递归的思想实现,以及循环关系         很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的。编程是解决问题的,而现实中很多的问题都是比较简单的,没有象汉诺塔那么复杂。我们也不必追究递归到底是怎样实现的,我们只是要会用递归,会用递归来为我们解决一些问题,这就行了。        首先来看一个例子:有一个Febonacci序列:      阅读详情

相关推荐

C/C++递归迭代(循环

任何能够使用递归解决的问题都能转换成迭代(循环递归的优点:使程序更清晰、更简洁,通过递归可以用更少的代码实现更强大的功能 递归的缺点:递归次数变多时,会耗费大量的时间内存 递归0~8的阶乘 #include <iostream> using namespace std; long factorial(int num) { if(num==0) return 1; else return num*factorial(num-1); } in

qq_44378854的博客 1147

C++递归与尾递归以及循环

你会发现 循环递归的 时间复杂度比较低,普通递归的时间复杂度很高。

lizfs_csdn的博客 322

递归函数调用栈

递归函数: 编写递归函数时,必须告诉它合适停止递归。 正因为如此,每个递归函数都有两部分:基线条件递归条件。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无线循环。 例: def countdown(i): print (i) if i <= 0: #基线条件 return else: #递归条件 countdown(i-1) print (countdown(10)) 调用栈: 栈的两种操作:压入

m0_46781785的博客 413

法设计与分析——递归循环

递归的定义若一个对象部分地包含它自己, 或用它自己给自己定义, 则称这个对象是递归的;若一个过程直接地或间接地调用自己, 则称这个过程是递归的过程。 递归函数:一个直接调用自己或通过一系列调用语句间接调用自己的函数递归的应用:数学函数:阶乘函数、2阶Fibonacci数列 数据结构:二叉树、广义表 八皇后、hanoi塔问题 递归法设计:将规模较大的原问题分解为一个或多个规模更小的与原问题类似的子问题-递归步骤(递归表达式) 确定一个或多个无须分解可直接求解的子

沐雨风栉 2706

简单谈谈 C/C++ 递归的思想实现,以及循环关系

很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的。编程是解决问题的,而现实中很多的问题都是比较简单的,没有象汉诺塔那么复杂。我们也不必追究递归到底是怎样实现的,我们只是要会用递归,会用递归来为我们解决一些问题,这就行了。         首先来看一个例子: 有一个Febonacci序列:         1,1,2,3

hustyangju的足迹 4406

初学者看过来:简单谈谈 C/C++ 递归的思想实现,以及循环关系

很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的。编程是解决问题的,而现实中很多的问题都是比较简单的,没有象汉诺塔那么复杂。我们也不必追究递归到底是怎样实现的,我们只是要会用递归,会用递归来为我们解决一些问题,这就行了。         首先来看一个例子:有一个Febonacci序列:        1,1,2,3,5,8,13,,21,34........它的问题是:求这个序列中的第N个数。由于它的函数原形是:f(n)=f(n-1

CNnumen 823

初学者看过来:简单谈谈 C/C++ 递归的思想实现,以及循环关系。 (转)

初学者看过来:简单谈谈 C/C++ 递归的思想实现,以及循环关系。 (转)[@more@] 很多初学者往往对递归迷惑不解,也在这上面花了不少的时间。其实教材上的例子很经典,只是它说的有一些唠叨了。初学者会看的头大的...

cuiji1279的博客 69

MiniMaxH3一键整合包部署全指南:本地、ComfyUI与云服务器优化

在AI应用快速落地的今天,模型部署成为技术社区的高频需求。部署一套生成式模型,核心在于理解运行环境、显存管理以及工作流编排。所谓“一键整合包”,本质上是将权重、运行时可视化界面封装,用“解压即用”降低启动门槛,但其背后仍需扎实的工程准备。从本地NVIDIA显卡的8G显存优化,到ComfyUI工作流的加载与节点调整,再到利用云服务器实现资源弹性,每一步都影响生成效率与稳定性。只有掌握显存占用、启动脚本、依赖路径等基础概念,才能真正驾驭整合包。MiniMaxH3一键整合包作为典型案例,完整展示了部署链路:从硬

ciya3282的博客 346

简单谈谈C++ 递归的思想实现以及循环关系

比如上面的函数吧,当n>3时,它显然只能求助于n-1,n-2。而(n-1)>2,(n-2)>2时,它们就求助于:(n-1)-1,(n-1)-2;然后··············直到(n-k)<3,(n-k-1)<3时,函数Febc终于有了返回值1 了,它再从头开始计,然后一直到n 为止。初学者会看的头大的。因为第n年要比n-1年多的牛,都是大于三岁的牛生的小牛,而f(n-3)正是那些在n年大于三岁的牛,然后它们在第n年生下相同数量的小牛。由于它的函数原形是:f(N)=f(n-1)+f(n-2)

lijiale20150909的博客 673

C++中的 .h .cpp 详解

通俗解释:.h.cpp差不多就像书目录的关系吧,目录中对书中的章节内容进行简单表示,真正的实现是在书里面的。 一般的数据,数据结构,接口,还有类的定义放在.h文件中,可以叫他们头文件,可以#include 到别的文件中。功能实现一般都放在具体的.cpp文件中,这样方便文件管理,节约时间,提高效率。 你完全可以把功能实现一并放在.h文件中,也可以#include一个.cpp文件到另一个源文件中...

a063225的博客 2万+

【C语言】函数递归思想

本文介绍了递归的基本概念、优缺点及与迭代的对比。实际应用中应根据问题特点选择合适的方法一起来学习一下吧。

LSRISME的博客 925

C/C++递归的定义调用(如何使用递归

从前有座山,山里有座庙,庙里有个老尚,正在给小尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老尚,正在给小尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老尚,正在给小尚讲故事呢!故事是什么呢?……’”

yaozhiyuannb的博客 2484

2023,我与C/C++相遇的奇迹之年

记录一下我踏入计机世界的起始年,分享一路上的感悟与酸甜苦辣,这一路有志同道合的伙伴同行,留下了太多的美好,我很珍惜。2023,我与C/C++相遇的奇迹之年就此落下帷幕,而希望,仍在远方眺望。最后,提前祝福大家新年快乐啦,新的一年写代码没有bug,写题目秒出思路哦!

Code Space 4564

【C语言】拒绝 “死循环套娃”!递归的 “刹车技巧”+3 个经典案例通关

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数方法。

小龙报的博客 1361

C++中的 .h .cpp 区别详解

C++编程过程中,随着项目的越来越大,代码也会越来越多,并且难以管理分析。于是,在C++中就要分出了头(.h)文件实现(.cpp)文件,并且也有了Package的概念。 对于以C起步,C#作为“母语”的我刚开始跟着导师学习C++对这方面还是感到很模糊。虽然我可以以C的知识面对C++的语法规范,用C#的思想领悟C++中类的使用。但是C#中定义实现是都在一个文件中(其实都是在类里面),而使用...

deeplan_1994的博客 4万+

递归的基本原理

看《法笔记》到递归了,遇到稍稍复杂一点的递归就会昏头。查阅资料发现大神们推崇《The Little Schemer》《SCIP计机程序的构造解释》这两本书,第一本貌似不太厚,但是只有全英版本,目前正在准备一件比较重要的事情,来不及看这两本超级经典了,有时间了真是一定要看啊。 今天中午午休时拿出了《C Primer Plus》,带着一点点希望,想从这里面找到一点“灵感”,之前也特意看过这本...

Tomorrow Never Knows 1万+
上一篇: 局域网命令大全
下一篇: 最全的acm资料web
linleiqin
博客等级 码龄17年 66粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值