递归实现顺序输出整数_小学生学习C++||第三十五节 递归

2da6af20a8fd37d6e40358c60d48fecd.png

斐波那契数列

斐波那契数列是这样的一个数列:1,  1,  2,  3,  5,  8,  13,  21,  ...,这个数列从第3个数开始,每个数都等于前面两个数的和。这个数列与大自然中植物的关系极为密切,几乎所有花朵的花瓣都来自这个数列中的一项数字,同时在植物的叶、枝、茎等排列中也存在斐波那契数列。

问题:完成程序,输出斐波那契数列中的第10项

图解思路,自下而上

3efa7873c112575066c7f27914817f5f.png

程序实现,自下而上:

#includeusing namespace std;int f(int n){    int a1=1,a2=1,a3;    for(int i=3;i<=n;i++){        a3=a2+a1;//自下而上,依次计算两项和        a1=a2;//上次的a2存放到新的次数a1中,实现a1向右移动        a2=a3;//上次的a3存放到新的次数a2中,实现a2向右移动    }    return a3;//返回最后索引项}int main(){    cout<10)<<    return 0;}

图解思路,自上而下

b038be605856841463758538a2bb19ce.png

程序实现,自上而下:

#includeusing namespace std;int a(int n){    if(n==1||n==2){        return 1;//1、初始条件(边界条件),最底层    }else{        return a(n-1)+a(n-2);//2、关系式,化整为零把大问题化为多个子问题    }}int main(){    cout<10)<<    return 0;}

自上而下的核心思想是,想要解决第n项问题,必须解决第n-1项问题,想要解决第n-1项问题,必须解决第n-2项问题,依次向下递推直到遇到最初始条件,再根据项与项之间关系式可以向上求解得出答案!

递归:程序调用自身的编程技巧称为递归

递归特点:通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

问题:完成程序,输出n的阶乘

阶乘:一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。

公式:n!=1×2×3×...×(n-1)×n

程序实现,递归(自上而下):

#include#includeusing namespace std;long long a(int n){    if(n==0){        return 1;    }else{        return n*a(n-1);//想要知道第n项,必须解决第n-1项,依次向前推进    }}int main(){    printf("%d",a(5))    return 0;}

汉诺塔(Hanoi)

有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序防止n个盘。实现把A杆上的盘全部移到C杆上,并保持原有顺序叠好。

规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

b56c77876b8d505598fe77928df80481.png

两个圆盘图解思路:

ecebf30c29df4810b9015458f99ba785.png

第一步图解:

3170d73508350bb913188f6f4d3708c9.png

第二步图解:

1221e7d62e334baa84ae9e273b01634d.png

第三步图解:

07aacd3b081be41fde6dabc8dce22f43.png

n个圆盘图解思路:

d1121967fe6c10fffedc816f486f0747.png

第一步图解:

把n-1个圆盘移动到目标杆,从上向下看就是一大步,不用纠结为什么可以一次移动这么多,这里这是运用了从上向下的递归思想,递归的核心思想是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解

5fbe7f4389092af862c70cee6ab8ca5f.png

第二步图解:向前推进一步就能实现最后一个盘子移动到目标杆,依次推进直到把n-1个盘子依次移动到目标杆!

90766b5771ca0c83d211bfcbd3d9d54b.png

第三步图解:

调换原始杆、中介杆以及目标杆的位置(程序中调换的实际是变量中的值),和第一步一样重新递归!

0f6dc4c63d8884a775e2ccab9c6f5984.png

程序实现:

#includeusing namespace std;void hanoi(char A,char B,char C,int n){  if(n>0){//圆盘的个数必须大于0     hanoi(A,C,B,n-1);//第一步:将前n-1项从A移动到B,A--->B     cout<"从 "<    hanoi(B,A,C,n-1);//第三步:将第n-1项从B移动到C,B--->C   }}int main(){    hanoi('A','B','C',10);     return 0;}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值