第一讲 递归

递归(recursion):程序调用自身的编程技巧。

递归满足2个条件:

1)有重复运行的过程(调用自身)

2)有跳出重复运行过程的条件(递归出口)

一、阶乘:

#include <iostream>
using namespace std;
int recursive(int i)
{
	int sum = 0;
	if (0 == i)
	return (1);
	else
	sum = i * recursive(i-1);
	return sum;
}
int main()
{
	int n,ans;
	cout<<"请输入一个整数n:"<<endl;
	cin>>n;
	ans=recursive(n);
	cout<<n<<"的阶乘为:"<<ans<<endl;
	return 0;
} 

二、汉诺塔

#include<stdio.h>
void move(int n,char a,char b,char c)
{
    if(n==1)
        printf("\t%c->%c\n",a,c);    //当n仅仅有1个的时候直接从a移动到c
    else
    {
        move(n-1,a,c,b);            //第n-1个要从a通过c移动到b
        printf("\t%c->%c\n",a,c);
        move(n-1,b,a,c);            //n-1个移动过来之后b变開始盘,b通过a移动到c,这边非常难理解
    }
}

main()
{
    int n;
    printf("请输入要移动的块数:");
    scanf("%d",&n);
    move(n,'a','b','c');
}

三、①斐波那契数

 #include <iostream>
using namespace std;
int Fib(int n)
{
 	if (n == 0)
  	return 0;
 	if (n == 1)
  	return 1;
 	if (n > 1)
  	return Fib(n-1) + Fib(n-2);
}
int main()
{
	int n,ans;
	cout<<"请输入一个整数n:"<<endl;
	cin>>n;
	ans=Fib(n);
	cout<<n<<"的斐波那契数为:"<<ans<<endl;
	return 0;
} 

三、②斐波那契数

#include <iostream>
using namespace std;
long long fibonacci(int n)
{ 

	if(n <= 2)
	{
		return 1;
	}	 

	int i;
	long long a = 1, b = 1; 

	for(i = 3; i <= n; ++i)
	{
		b = a + b;
		a = b - a;
	} 

	return b;
}

int main()
{
	int n,ans;
	cout<<"请输入一个整数n:"<<endl;
	cin>>n;
	ans=fibonacci(n);
	cout<<n<<"的斐波那契数为:"<<ans<<endl;
	return 0;
} 

四、迷宫问题(深搜)

#include<iostream>
using namespace std;
#define min(a,b) a < b ?

a : b
int Map[9][9] =    {1,1,1,1,1,1,1,1,1,
                    1,0,0,1,0,0,1,0,1,
                    1,0,0,1,1,0,0,0,1,
                    1,0,1,0,1,1,0,1,1,
                    1,0,0,0,0,1,0,0,1,
                    1,1,0,1,0,1,0,0,1,
                    1,1,0,1,0,1,0,0,1,
                    1,1,0,1,0,0,0,0,1,
                    1,1,1,1,1,1,1,1,1,};
int a,b,c,d,num;
void dfs(int x,int y,int s){
    if(Map[x][y]) return;
    if(x == c && y == d){
        num = min(s,num);
        return;
    }
    s++;
    Map[x][y] = 1;
    dfs(x - 1,y,s);
    dfs(x + 1,y,s);
    dfs(x,y - 1,s);
    dfs(x,y + 1,s);
    Map[x][y] = 0;
}
int main(){
    int n;
    cin >> n;
    while(n--){
        num = 10000;
        cin >> a >> b >> c >> d;
        dfs(a,b,0);
        cout << num << endl;
    }
    return 0;
}

四、迷宫问题(广搜)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
int dir[4][2]= {1,0,-1,0,0,1,0,-1};
struct point{
    int x,y,step;
};
int bfs(point s,point e,int map[9][9]){
    queue<point>tp;//自己定义类型的队列
    int i;
    point t;//保存当前坐标 ,暂时变量
    //s表示之前
    //e表示目标
    s.step=0;//保存步数
    map[s.x][s.y]=1;//标记此处已经走过
    tp.push(s);//初始化队列 ,s中(x,y)初始为起始坐标。step = 0
    while(!tp.empty()){//循环直至队列为空
        s=tp.front();//每次循环s都等于队首
        tp.pop();//删除队首
        if(s.x==e.x&&s.y==e.y)//假设当前坐标与目标坐标相等
            return s.step;    //返回当前的步数
        //遍历四个不同的方向
        //假设是通道(0),即添加步数
        for(int i=0; i<4; i++){
            t.x=s.x+dir[i][0];
            t.y=s.y+dir[i][1];
            if(map[t.x][t.y]==0){//假设是通道
                t.step=s.step+1;
                map[t.x][t.y]=1;//标记此处已经走过。及标记为墙
                tp.push(t);
            }
        }
    }
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        point s,e;
        int map[9][9]= {1,1,1,1,1,1,1,1,1,
                        1,0,0,1,0,0,1,0,1,
                        1,0,0,1,1,0,0,0,1,
                        1,0,1,0,1,1,0,1,1,
                        1,0,0,0,0,1,0,0,1,
                        1,1,0,1,0,1,0,0,1,
                        1,1,0,1,0,1,0,0,1,
                        1,1,0,1,0,0,0,0,1,
                        1,1,1,1,1,1,1,1,1,};
        scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y);
        printf("%d\n",bfs(s,e,map));
    }
    return 0;
}
时间: 2024-10-02 14:45:04

第一讲 递归的相关文章

第一讲 递归与循环3

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 /* * @Author: SHUAI * @Date:   2015-12-05 08:50:58 */ /*         串的比较,思路s1[0]==s2[0] 逐层递归         三个出口 长度不同  比较到最后0个 首字符不同         递归条件 不在出口范围说明首字

第一讲 递归与循环[总结]

? 1 2 3 4 5 6 7 8 9 10 11 12 13 总结: 递归调用仅仅是被调函数恰为主调函数 注意每次调用的层次不同 注意每次分配形参并非同一个变量 注意返回的次序 形象的故事: 从前有座山(1).山里有座庙(1).庙里有个老和尚(1)和小和尚(1). 老和尚对小和尚说: “从前有座山(2).山里有座庙(2).庙里有个老和尚(2)和小和尚(2). 老和尚对小和尚说: "从前有座山(3).山里有座庙(3). 庙里有个老和尚(3)和小和尚(3).老和尚对小和尚说:……”   =====

第二课:第一讲Linux操作系统及常用命令

第二课:第一讲Linux操作系统及常用命令1.liunx中"X"表示图像显示协议X-window有三种:Gnome,KDE,Xface2.windows->.dll(dynamic link library)liunx->.so (shared object)3.认证:authentication授权:authorization审计:audition(通过日志记录下来实现审计机制)4.登录成功后的"[[email protected] root]"是pr

html学习第一讲(内容html常规控件的的使用)

1 <html> 2 <head> 3 <title> 这是网页的标题</title> 4 </head> 5 6 <body> 7 <h2><font color ="blue"> 这是网页的内容!</font></h2> 8 9 <a href="http://www.cnblogs.com/gongxijun">这是一个连接<

《上古天真论》第一讲文字版

上古天真论篇第一讲主讲:徐文兵  主持:梁  冬播出时间:2008-12-06  23:00—24:00  经文:昔在黄帝,生而神靈,弱而能言,幼而徇齐,长而敦敏,成而等天.乃问于天师曰:余闻上古之人,春秋皆度百岁,而动作不衰:今时之人,年半百而动作皆衰者,时世异耶?人将失之耶?岐伯对曰:上古之人,其知道者,法于阴阳,和于术数, 梁冬:我是梁冬.梁某人.而做在我对面的是我的在求学中医方面的偶像级的老师徐文兵老师,徐老师你好!徐文兵:梁冬好!听众朋友们大家好!梁冬:啊呀,一看就很有这个电台风范,从

《大话数据结构》 第一讲.数据结构绪论 (读书笔记)

大话数据结构 导读笔记 第一讲: 一.基本概念和术语 (1)数据元素:是组成数据的.有一定意义的基本单位,在计算机中通常作为整体处理.也被称为记录.   比如,在人类中,什么是数据元素呀?当然是人了. (2)数据项:一个数据元素可以由若干个数据项组成.   比如人这样的数据元素,可以有眼.耳.鼻.嘴.手.脚这些数据项,也可以有姓名.年龄.性别.出生地址.联系电话等数据项,具体有哪些数据项,要视你做的系统来决定. 数据项是数据不可分割的最小单位.在数据结构这门课程中,我们把数据项定义为最小单位,是

原创PHP编程第一讲《十五天学会PHP》林伟帆教学视频

我自己录制的原创php编程教学视频第一讲<十五天学会php>,为了帮助大家的学习,引领大家进入互联网动态时期,谢谢大家的观看.原创php编程教学视频<十五天学会php>第一讲EXE高清视频格式下载地址1: http://pan.baidu.com/s/1dDxVFOH 下载地址2: http://pan.baidu.com/s/1gdvj9KZWMV视频格式下载地址:http://pan.baidu.com/s/1sjBe05f我会不定期更新哦,现在是第一讲助人为快乐之本,本人自己

(转)【风宇冲】Unity3D教程宝典之AssetBundles:第一讲

自:http://blog.sina.com.cn/s/blog_471132920101gz8z.html 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 AssetBundles第一讲:基本使用 AssetBundles是从unity导出你选择的assets,它使用特有的压缩格式并且应用可以实时去读取它.包括模型贴图音频等任何asset类型,甚至整个场景.压缩大小基本能达到zip的效果.AssetBundles从设计时就定位为可以很简单就下载到应用里.如果你想包括自定义的bina

第一讲:Android开发环境的搭建

一.Android简介 Android 是基于Linux内核的软件平台和操作系统.Android构架主要由3部分组成,linux内核层,类库.虚拟机和核心组件库层,应用程序框架层Android应用程序使用JAVA语言进行开发. 二.开发环境的搭建 软件的准备:JAVA  JDK 1.6Eclipse 3.6           (eclipse-java-helios-win32.zip)ADT 0.9.7             (Android Development Tools)SDK T