递归算法(C++新手教程)

       这么久没更新主要是跟我一个同学合作(@楼浩晨,这家伙咋还不更新!),暑假我时间很少,理解一下。

        步入正题,今天说的是递归。想必大家都听过这个故事:“从前有座山,山里有座庙,庙里有个老和尚,老和尚给小和尚讲故事:‘从前有座山,山里有座庙……’”。这跟递归正有异曲同工之妙。递归,顾名思义“递了又归”,是一个“自己调用自己”的函数。示意图请看:

在这里插入图片描述

       递归思维是一种从下向上的思维方式,使用递归算法往往可以帮我们解决复杂的问题。递归算法的难点就在于它的逻辑性,一般设计递归算法需要考虑以下三点:

       ①明确递归的终止条件

       ②提取重复的逻辑,缩小问题的规模不断递去

       ③给出递归终止时的处理办法

       这图文都给了,代码框架就不给大家了。我们直接看题目吧:

一、斐波那契数列

       斐波那契数列:1,1,2,3,5,8,……输入一个正整数n,输出斐波那契数列中的第n个数。(第一个是1,第二个是1)。这题太简单,图就不用了(主要是懒),咱们直接上代码:

#include<bits/stdc++.h>
using namespace std;
int fibo(int x){
	if(x==1||x==2){//第一个是1,第二个是1
		return 1;
	}
	return fibo(x-1)+fibo(x-2);//第x个数=第x-1个数+第x-2个数 
}
int main(){
	int n;
	cin>>n;
	cout<<fibo(n);
	return 0;
}

二、阶乘

       输入一个正整数n,输出n的阶乘。提示:n!=(n-1)*(n-2)*…*1。

       这题给个图(别人那里拿来的),例子n=4:

在这里插入图片描述

       图看懂了,上代码:          

#include<bits/stdc++.h>
using namespace std;
int f(int x){
	if(x==1){
		return 1;
	}
	return x*f(x-1);//第x个数*第x-1个数
}
int main(){
	int n;
	cin>>n;
	cout<<f(n);
	return 0;
}

三、汉诺塔(Hanoi)
       编程实现把 A 的 n 个盘子移动到 C(盘子编号是 [1, n] ),每次只能移动1个盘子,大盘子只能放在小盘子下面。

1、汉诺塔 — 1个盘子

在这里插入图片描述

2、汉诺塔 — 2个盘子

在这里插入图片描述

3、汉诺塔 — 3个盘子

在这里插入图片描述

在这里插入图片描述

思路:
分两种情况讨论:
       1、当 n==1时,直接将盘子从 A 移动到C。
       2、当 n > 1时,可以拆分成3大步骤(如下)
将 n– 1 个盘子从 A 移动到B,将编号为 n 的盘子从 A 移动到C,将 n– 1 个盘子从 B 移动到C。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

       上代码:

#include<bits/stdc++.h>
using namespace std;
void move(char A, char C, int n){
	cout<<"把第"<<n<<"个圆盘从"<<A<<"--->"<<C<<endl;
}
void hanoi(char A,char B,char C,int n){
	if(n==1){
		move(A, C, n);
	}
	else{
		hanoi(A, C, B, n - 1);//将n-1个圆盘从A柱借助于C柱移动到B柱上
		move(A, C, n);//将A柱子最后一个圆盘移动到C柱上
		hanoi(B, A, C, n - 1);//将n-1个圆盘从B柱借助于A柱移动到C柱上
	}
}
int main(){
	int n;
	cin>>n;
	hanoi('A','B','C',n);
	return 0;
}

好啦,递归到这里差不多就完事了,拜拜~

||注:本人的代码可能有些错误,找到错误可以在评论区说出来,作者尽快改正。@楼浩晨  他可能会写一篇Scratch中的递归,可以关注一下。||    

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悲の垩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值