递归问题

12 篇文章 0 订阅
1 篇文章 0 订阅

1.什么是递归?

一说起递归,我想每个人都不陌生。举个从小就听过的例子:从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山…

递归是一定要有终止条件的,不然你电脑会炸掉的

还有你从两面相对的镜子中看到的画面,其实都是抽象出来的递归现象,但是严格来说并不是递归,因为会一直重复下去,没有终止条件,那就称为死循环了。有关递归和死循环的异同我们之后会说到,那么现在先来了解一下什么是递归?

那么什么是递归呢? 要理解递归,就得先了解什么是递归,实际上这句话就是一个递归。这么说可能不好理解,给出代码就好说了

这严格来说不是递归,而是一个死循环

int main(){
  cout<<"什么是递归?"<<endl;
  cout<<"问s吧";
  s("什么是递归?");
}
void s(string a){
  cout<<"我不知道"<<a<<",还是问s吧";
  s("什么是递归?");
}

//什么是递归?问s吧,我不知道什么是递归,还是问s吧。我不知道什么是递归。。。。。。

应用

斐波拉契数列

#include <iostream>
using namespace std;
long long f(int a){
  return f(a-1)+f(a-2);
  if(a<=2){
    return 1; 
  }
} 

//斐波那契数列 1 1 2 3 5 8 每一(>2)个为 前两个数之和 1和2输出1

3.例题

最大公约数

题目描述

    给定两个正整数,求它们的最大公约数。

输入描述 

    输入一行,包含两个正整数(<1,000,000,000)。

输出描述    

    输出一个正整数,即这两个正整数的最大公约数。

样例

输入

    6 9

输出

    3

代码:

#include <iostream>
using namespace std;
int gcd(int a,int b)
{if(a%b==0) return b;           
     else gcd(b,a%b);                
 
}
int main()
{
    int a,b;
    cin>>a>>b;
    cout<<gcd(a,b);
   return 0;
}

2.汉诺塔

题目描述

设有n个大小不等的中空圆盘,按照从小到大的顺序叠套在立柱A上,另有两根立柱B和C。现在要求把全部圆盘从A柱(称为源柱)移到C柱(称为目标柱),移动过程中可借助B柱(称为中间柱)。移动时有如下的要求:

1) 一次只许移动一个盘。

2) 任何时候、任何柱子上不允许把大盘放在小盘上边

3) 可使用任意一根立柱暂存圆盘。

问:如何用最少步数实现n个盘子的移动?请打印出具体的移动方案

输入描述

一行一个正整数n,1<=n<=18

输出描述

输出若干行,第i行表示第i布的移动方案

样例

输入

3

输出

A->C
A->B
C->B
A->C
B->A
B->C
A->C

思路:

这道题非常经典,我们从简单入手,如果只有两个盘子,会怎么样?

将小盘子移到B柱

大盘子移到C柱

小盘子移到C柱

三个盘子:

最小盘子移到C柱

中盘子移到B柱

小盘子移到B柱

大盘子移到C柱

小盘子移到A柱

中盘子移到C柱

小盘子移到C柱

代码:

#include<iostream>
using namespace std;
void hanoi(char a,char b,char c,int n){
    if (n==1) cout<<a<<" -> "<<c<<endl;  //直接移动到C柱,输出 
    else {
        hanoi(a,c,b,n-1);  //把上面n-1个移到B柱
        cout<<a<<" -> "<<c<<endl;  //输出
        hanoi(b,a,c,n-1);  //把剩下n-1个从B柱移到C柱
    }
}
int main(){
    int n;
    cin>>n;
    hanoi('A','B','C',n);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值