这么久没更新主要是跟我一个同学合作(@楼浩晨,这家伙咋还不更新!),暑假我时间很少,理解一下。
步入正题,今天说的是递归。想必大家都听过这个故事:“从前有座山,山里有座庙,庙里有个老和尚,老和尚给小和尚讲故事:‘从前有座山,山里有座庙……’”。这跟递归正有异曲同工之妙。递归,顾名思义“递了又归”,是一个“自己调用自己”的函数。示意图请看:
递归思维是一种从下向上的思维方式,使用递归算法往往可以帮我们解决复杂的问题。递归算法的难点就在于它的逻辑性,一般设计递归算法需要考虑以下三点:
①明确递归的终止条件
②提取重复的逻辑,缩小问题的规模不断递去
③给出递归终止时的处理办法
这图文都给了,代码框架就不给大家了。我们直接看题目吧:
一、斐波那契数列
斐波那契数列: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中的递归,可以关注一下。||