zafu算法课作业1——递归题解

算法网课笔记(六)——递归 给定一个用户ID,如何查找其“最终推荐人” 递归 典型递推公式:f(n)=f(n-1)+1,f(1)=1 递归代码 int f(int n){ if (n==1) return 1; return f(n-1)+1; } 递归的三个条件 1.一个问题的解可以分解为几个子问题 2.子问题与原问题,除了数据规模,求解思路完全一样 3.存在递归终止条件 如何写递归代码 关键:(1)递推公式,(2)终止条件 以走楼梯为例,n阶楼梯,可以一步一阶或者一步2阶,有多少种走法? 递推公式:f(n)=f(n-1) 阅读详情

A是个比较好的递归例题,BCD用递推写会比较方便,但是递归也能写,主要是教学一个递归的剪枝,还有递推(递归)关系式的推导。
一些相对复杂的递推关系式用递推就很难来实现了。
E的话是一个dfs的经典例题。
F的话是一个相对综合的基础dfs。

A题
题目来源UVA10696:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1637

题意为现在定义了一个函数f91(x),当x>100的时候,f91(x)=x-10,当x<=100的时候f91(x)=f91(f91(x+11))。

属于一道比较好的递归例题,在这里你并不需要真的理解f91(x)这个函数的规律是如何,只是关注不同层次之间的递归关系,以及递归的终止条件即可。
此处x<=100的时候f91(x)=f91(f91(x+11))便是递归层次之间的递归关系,自身不断调用自身;
而当x>100的时候,f91(x)=x-10就是递归的终止条件,此时返回一个具体的整数值,不再调用自身继续递归下去。

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<bitset>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
#define ll long long
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;
const ll maxn=1e5+7;

int f91(int x)
{
    return x>100?x-10:f91(f91(x+11));
}

int32_t main()
{
    IOS;
    int x;
    while(cin>>x,x) cout<<"f91("<<x<<") = "<<f91(x)<<endl;
}

B题
题目来源HDU2044:http://acm.hdu.edu.cn/showproblem.php?pid=2044

中文题意就不翻译了。

这道题用递推做会比较方便,用递推做的前提是认识到这道题中的特殊关系。
由于我们只能爬向右侧相邻的蜂房,因此我们很容易注意到,我们下一步如果要走到蜂房x,那么我们就只能从x-1和x-2这两个蜂房走过来。也就是说从起点走到蜂房x的方案数,等于从起点分别走到蜂房x-1和x-2这两个蜂房的方案数的和。这个关系和斐波那契数列的关系如出一辙。
再思考下去的话,我们会发现,我们所需要关注的只是起点和终点的下标差值,这个差值决定了我们最后输出的结果是斐波那契数列中的第几项。
由此我们可以直接预处理出斐波那契数列,然后对于每组数据,直接根据起点终点的下标差值输出对应斐波那契数列的值即可。
ps:注意斐波那契数列大概在四十项左右就会爆掉Int上限,因此这里要用longlong

递推写法:

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<bitset>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define ll long long

vector<ll>num(100);
int main()
{
	num[0]=1;num[1]=2;
	for(int i=2;i<50;i++) num[i]=num[i-1]+num[i-2];//预处理出斐波那契数列

	int x;
	cin>>x;
	while(x--)
	{
		int a,b;
		cin>>a>>b;
		cout<<num[b-a-1]<<endl;
	}
}

当然这道题也是可以用递归来写的,但是如果直接递归写的话会tle超时。
原因的话在于这里的递归层次最多有50层,而每一层递归,计算cal(x)的时候,cal(x)=cal(x-1)+cal(x-2),会分化出两层递归。cal(7)会分化出cal(6)和cal(5),而cal(6)又会分化出cal(5)和cal(4),注意到此处cal(5)被计算了,递归50层的话这样的重复计算次数会非常庞大,最终导致超时。

这里的话可以用ans[i]记录,当我们走到蜂房i的时候有多少种路径情况,并且当ans[i]已经计算的时候,就不再调用递归去计算,直接返回之前已经计算出的ans[i]即可。使用这样记录来减少递归重复运算的方法,被称为对递归的剪枝。递归的层级其实可以被画成一颗递归树,而我们通过记录减少递归重复运算就等同于对这棵树的重复枝杈进行了修剪去除。

这道题的递归关系还不算非常复杂,因此使用递推会比较容易写,但是如果类似于A题的递归关系或者更复杂的一些关系,使用递推就很难实现了。

递归剪枝:

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<bitset>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
#define ll long long
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

ll ans[50];

ll dfs(int b,int a)
{
    ll ret=0;
    if(ans[b]!=-1) return ans[b];//如果当前b值已经被计算过,不调用下面的递归部分,直接返回已计算值即可
    if(b-1>=a) ret+=dfs(b-1,a);
    if(b-2>=a) ret+=dfs(b-2,a);
    return ans[b]=ret;
}

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int a,b;
        scanf("%d%d",&a,&b);
        for(int i=a;i<=b;i++) ans[i]=-1;//-1标记当前位置仍未被计算过
        ans[a]=1;
        printf("%lld\n",dfs(b,a));
    }
}

C题
题目来源HDU2046:http://acm.hdu.edu.cn/showproblem.php?pid=2046

中文题意不再赘述。

这道题最后仍然是和B题一样,是一个斐波那契数列的结果,关键在于如何自己观察思考推导出这样的一个结论。
首先很容易得到,当只有一列的时候,骨牌只有一种摆法,当有两列的时候,骨牌有两种摆法。
再之后运用到的递推思想,我们需要推导n=x的方案,那么我们假设n<x的情况都已经被计算出,那么我们就相当于在最后加了一列未确定摆法的格子。
最后一列两种摆法:
1.竖着摆放一根骨牌的摆法,这种摆法的方案数就等同于n=x-1,也就是没有最后一列时候的方案数,n=x-1时候的方案数。
2.横着摆放两根骨牌的摆法,这种摆法会使用掉x-1和x两列,也就是没有最后两列时候的方案数,n=x-2时候的方案数。

由此我们就已经推得递推关系式,又是一个斐波那契数列。

ps:书上的知识点都是死的,同样都是斐波那契数列,同样是这样的递推方式,有没有一个自己观察和总结规律的能力是完全不同的。

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<bitset>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
#define ll long long
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

ll ans[60];

int32_t main()
{
    IOS;
    ans[1]=1;ans[2]=2;
    for(int i=3;i<=50;i++) ans[i]=ans[i-1]+ans[i-2];
    int n;
    while(cin>>n) cout<<ans[n]<<endl;
}

D题
题目来源HDU2049:http://acm.hdu.edu.cn/showproblem.php?pid=2049

中文题意不再赘述。

这道题的话相对上一题的难度跨度略大,难点在于递推关系式如何推导出来。
首先n个人中m个选错了新娘,我们必然要计算一个C(n,m)的组合数。
之后我们需要思考m个人全部选错了新娘有几种情况,用cas[m]来记录。
当m=1的时候,cas[1]很容易推出为0,
当m=2的时候,cas[2]很容易推出为1。
之后采用和上面题目一样的思考方式,我们求取m=x的方案数的时候,是已经在m<x的所有方案数都已经求得的情况下,我们需要用m<x已经计算好的部分来推得m=x的方案数。
加进来的第m个人必定要在前面的m-1个人中选一个人的新娘来错选,因此总的方案数肯定要乘以一个m-1。
然后我们可以按照被错选的那个新娘原配新郎的当前选择分为两种情况来讨论:
1.那个新郎选择了新加进来的第m个人的原配新娘,也就是这两个人相互选择了对方的新娘,此时的方案数即为m-2人全部选错的时候的方案数
2.那个新郎没有选择新加进来的第m个人的原配新娘,此时我们把第m个人的原配的新娘当做这个新郎的原配新娘,这样的话前面的m-1个人在这种情况下又转变为了m-1个人全部选错的时候的方案数。

因此最后的答案就是C(n,m) ×\times× cas[m]

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<bitset>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
#define ll long long
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

ll cas[30];//cas[i]存储i个人全部选错有多少种情况

int32_t main()
{
    IOS;
    cas[1]=0;cas[2]=1;
    for(int i=3;i<=20;i++) cas[i]=(cas[i-1]+cas[i-2])*(i-1);
    int c,m,n;
    cin>>c;
    while(c--)
    {
        cin>>n>>m;
        ll ans=cas[m];
        if(m>n/2) m=n-m;//计算组合数(n,m),如果m比n的一半大则m直接去n-m方便计算,避免值过大爆掉longlong上限
        //组合数有许多种优秀的求法,这里使用了这种比较通俗易懂的写法
        for(int i=0;i<m;i++) ans*=n-i;
        for(int i=1;i<=m;i++) ans/=i;
        cout<<ans<<endl;
    }
}

E题
题目来源HDU1241:http://acm.hdu.edu.cn/showproblem.php?pid=1241

vjudge上放的中文题意,不再赘述。

直接看代码注释即可。

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<bitset>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
#define ll long long
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

int n,m;
char field[107][107];

void dfs(int a,int b)//对当前这一块油田进行dfs,全部置为*地面
{
    if(a<0||a>=m) return;
    if(b<0||b>=n) return;//如果dfs到了矩形区域外则结束当前dfs
    if(field[a][b]=='*') return;//如果dfs到了地面也结束当前dfs
    field[a][b]='*';//将当前地块置为地面
    for(int i=-1;i<=1;i++)
        for(int j=-1;j<=1;j++)//向周围8个方向走
            if(i!=0||j!=0) dfs(a+i,b+j);
}

int32_t main()
{
    IOS;
    while(cin>>m>>n,m)
    {
        for(int i=0;i<m;i++) cin>>field[i];
        int ans=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(field[i][j]=='@')
                {
                    ans++;
                    dfs(i,j);
                }
        cout<<ans<<endl;
    }
}

F题
题目来源HDU1016:http://acm.hdu.edu.cn/showproblem.php?pid=1016

vjudge上放了中文题意,不再赘述。

直接看代码注释即可,考察代码实现基本功,写法各有不同。

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<bitset>
#include<cstdio>
#include<string>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<fstream>
#include<iomanip>
#include<sstream>
#include<iostream>
#include<algorithm>
#include<functional>
#define ll long long
#define llINF 9223372036854775807
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
using namespace std;

int n;

vector<vector<int>>ans;
vector<int>now;

bool prime[40];
bool num[30];//num[i]存储i这个数字当前是否已经被使用过

void dfs()
{
    if(now.size()==n)
    {
        if(prime[now[n-1]+now[0]]) ans.push_back(now);//如果当前已经构造出了n个数字,并且判断下头和尾加起来是否也是素数
        //如果都满足的话,代表是一组答案,放入ans数组里
        return ;//递归终止
    }
    for(int i=1;i<=n;i++)//枚举每一个数字
    {
        if(!num[i]&&prime[i+now[now.size()-1]])//如果当前数字未被使用并且和前一个数字加起来是素数则继续递归
        {
            now.push_back(i);
            num[i]=1;
            dfs();
            num[i]=0;//还原num和now
            now.pop_back();
        }
    }
}

int32_t main()
{
    IOS;
    for(int i=2;i<40;i++)//预处理出40以内哪些数字是素数
    {
        prime[i]=1;
        for(int j=2;j*j<=i;j++)
            if(i%j==0) prime[i]=0;
    }
    int cas=0;
    memset(num,0,sizeof(num));
    while(cin>>n)
    {
        ans.clear();
        now.resize(1,1);num[1]=1;

        dfs();
        cout<<"Case "<<++cas<<':'<<endl;
        for(int i=0;i<ans.size();i++)
        {
            for(int j=0;j<ans[i].size();j++)
            {
                if(j) cout<<' ';
                cout<<ans[i][j];
            }
            cout<<endl;
        }
        cout<<endl;
    }
}
【算法学习笔记七】递归之分治法 分治算法把问题实例分成若干子实例(多数情况下分成两个),并分别递归地解决每个子实例,然后把这些子实例的解组合起来,得到原问题实例的解。 划分步骤:将输入划分为p≥1部分,每个部分的大小都严格小于原始实例的大小n; 治理步骤:如果问题的大小大于某个预定义的阈值n0,这个步骤由执行p个递归调用组成; 组合步骤:将p个递归算法的解组合起来,以获得所需的输出。组合步骤对于几乎所有分治算法的性能都... 阅读详情

相关推荐

OI基本算法题目(1.回溯2.递归与递推3.贪心4.分治5.图6.树7.搜索8.动态规划)

1.回溯 2.递归与递推 3.贪心 4.分治 5.图 6.树 7.搜索 8.动态规划 题目比较基础,适合初学者

大一新生LinYX 最近学了一个新的算法—递归,他发现这个算法可以解决一些高中的数列问题,如果已知f1以及公式fn=a*fn-1+b,求fn很方便。聪明的你也应该已经学会了递归,那就来表现一下吧。

#include<stdio.h> int fun(int n, int f1, int a, int b) { int f; if (n == 1) { return f1; } else { return a * fun(n - 1, f1, a, b) + b; } } int main() { int n, f1, a, b; while (scanf("%d%d%d%d", &n, &f1, &a, &b)!=E.

Tomatos_baby的博客 1840

ctf——writeup

ctf线上赛——第三关地址:http://106.75.86.18:2222提示:ip spoofing——ip伪造首先访问目标地址,一个正常的网页,挺文艺的。上面有些提示。根据上面的提示,我们浏览网页。找了好久,终于找到你。这个跳转链接。(在这个页面下方)我们接着点击这个链接,就跳转到administrator.php这个页面了。看到这个登录页面,就要知道用户名,密码,可是没有怎么办。一开始也试

Child_by_dream的博客 1320

数据结构与算法之美 | 学习笔记07 ——递归

一、递归 1.实现递归 去的过程为递,回的过程为归。递归要满足的三个条件: 一个问题可以分解为几个子问题的解; 问题与子问题,除了数据规模不同,求解思路完全一样 存在递归终止条件 关键:写出递推公式,找到终止条件。 示例:n个台阶,每次可以跨1或2个台阶,请问走这n个台阶有多少种走法? 求解: 递推公式:根据第一步的走法把所有走法分两类:第一类是第一步走了1个台阶,之后的走法就是n-1个台阶的...

跟一大桃一起学习 366

风控IV、AUC、KS python计算代码

df_temp:数据集,Y:是否逾期标签,feas_list:需要计算IV的 变量。2、 按月和不同Y 下的 IV计算。

暮雨听轩的专栏 1618

CentOS 7下Oracle 11G RAC静默安装避坑指南:从网络规划到共享存储配置全流程

本文详细介绍了在CentOS 7环境下进行Oracle 11G RAC静默安装的全流程,包括网络规划、共享存储配置和系统参数调优等关键步骤。特别针对静默安装过程中的常见问题提供了实用的避坑指南和优化建议,帮助技术人员高效完成企业级数据库部署。

weixin_29234509的博客 124

递归设计求解

/* * 程序的版权和版本声明部分 * Copyright (c)2013, 烟台大学计算机学院学生 * All rightsreserved. * 文件名称: fun.cpp * 作 者: 李巧丽 * 完成日期:2013年 3月 4日 * 版本号: v1.0 * * 输入描述:求1*3*5*7*.......*(2n-1) * 问题描述:略 * 程序输出:sum */ #include u

李巧丽 982

STM32与小米CyberGear微电机的CAN通信协议深度解析

本文深度解析STM32与小米CyberGear微电机的CAN通信协议,涵盖硬件连接、CAN总线配置、通信协议解析及多电机协同控制。重点介绍了基于STM32的电机控制实践,包括运动模式、速度与位置模式设置,以及数据反馈与故障诊断,为机器人及自动化设备开发提供实用指南。

www00的博客 360

递归算法详解

递归(Recursion)是指在定义一个问题时,问题的解法包含了对问题本身的调用。换句话说,递归算法通过重复执行相同的过程来分解复杂的问题,直到问题可以直接解决为止。递归的本质是分治思想,将大问题分解成多个小问题,通过解决这些小问题来完成大问题。每次递归调用都会把原问题简化,最终会达到一个容易处理的“基本情况”(base case),从而停止递归过程。递归是一种强大的算法工具,它通过分解问题、解决子问题,最终得出原问题的解。

X 1356

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

蓝牙攻防实战指南:低功耗蓝牙

Bluetooth Low Energy(也称Bluetooth Smart)是经典蓝牙(Bluetooth Classic)的演进版本,设计目标是实现极低功耗,适用于无需频繁更换电池的设备,如智能手环、健康监测器、蓝牙标签等。Bluetooth Low Energy 是一项极具前景的无线通信技术,它以极低的功耗实现了短距离高效通信,广泛应用于智能设备和物联网领域。然而,其简化的协议结构和配对机制也带来了不小的安全挑战。

idlecloud0105的博客 682

计算机算法设计与分析 实验题 及代码

很舒服的题目,不难。科班的知识就是舒服。 实验2:递归与分治 实验目的 熟悉递归算法的基本思想和基本步骤,熟练掌握递归公式的推导和定义方法,用递归算法解决实际问题。 实验要求 f 对本实验中的问题,设计出算法并编程实现。 实验内容: 注意:以下算法要求使用函数实现,都放到一个程序文件里面。即只使用使用一个main函数。 1 求最大公约数 (30分) 使用辗转相除法和递归求两个正整数m和n的最大公...

南湖小皮的博客 177

智能汽车嘚啵嘚 --- 智能座舱第七稿:智能座舱的升级OTA

智能汽车嘚啵嘚 --- 智能座舱第七稿:智能座舱的升级OTA

Soly_kun的博客 414

zafu 1461 (DP)

http://info.zjfc.edu.cn/acm/problemDetail.aspx?pid=1461 Simple Game 时间限制 : 1000 ms 内存限制 : 32 MB 提交次数 : 63 通过次数 : 31 题目描述 有n堆沙子,第i堆沙子的重量是W(i),有一个小游戏是要把这n堆沙子给合并成一堆沙子。 每次只能将相邻两堆沙子合...

weixin_33738982的博客 233

【Python基础】01 如何安装Python及集成环境

本文详细介绍了Python 3.13开发环境的完整搭建流程,涵盖三大操作系统(Windows/macOS/Linux)的Python安装方法、PyCharm专业IDE的配置使用,以及pip包管理工具的应用技巧。内容包括:Python 3.13各系统安装指南、PyCharm社区版与专业版的安装配置、环境验证方法、pip的基本命令与镜像源优化、虚拟环境管理,以及常见问题的解决方案。通过本教程,读者可获得一个高效完备的Python开发环境,为后续编程学习打下坚实基础。

nmdbbzcl的博客 1419

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

杭电 25道动态规划汇总

HDU 25道动态规划题的解题报告 http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=1264 密码:zafu A.         最简单的dp,但很重要。说明了动态规划产生的动机之一:递归产生的大量重复子问题。有两种解决方法,一、记忆化搜索,就是在用递归处理问题的过程中把已经算过的状态记录在一张表dp[][]中,下一次需要重复

qingyunbiying的专栏 1675

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

PTA—— 递归 递推

递归递推习题及解析,java。

m0_65144570的博客 1144

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

2019牛客暑期多校5B:generator 1【广义斐波拉契数列循环节模板】

题目: 2019牛客暑期多校训练营5B:generator 1 题意: Fn = aFn-1 + bFn-2 ,给出Fn数列的前两项F0和F1,求Fn【n大到要用字符串输入】 笔记: (1)十进制矩阵快速幂 递推式直接给出了,但N大的我不敢写矩阵快速幂,赛后了解到十进制矩阵快速幂,原理和二进制一样:比如求矩阵A^123,等价于计算:A^100 * A^20 * A^3 = (A^100...

KobeDuu 318

算法问题——递归算法学习(数据结构中的二叉树)

递归算法的学习: 递归的终止条件和递归的过程 二叉树的四种遍历 二叉树的增删改查的算法 递归算法的练习题目 递归的终止条件和递归的过程 二叉树的四种遍历 二叉树的增删改查的算法 递归算法的练习题目 ...

庄小焱 485

史上最全的Unity面试题(含答案)

一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足。 二:Unity3d中的碰撞器和触发器的区别? 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCol

崔小妹儿Jessica的博客 3万+

【算法】递归与while循环的通俗比较

前言 小结:至于两者的转换,又是另一个问题了。

玫瑰与鹿° 1万+

微软公司等数据结构+算法面试100题(第1-100题)全部出炉

微软等公司数据结构+算法面试100题(第1-100题)首次完整亮相                        作者:July、2010年12月6日。更新:现今,这100题的答案已经全部整理出来了,微软面试100题2010年版全部答案集锦:http://blog.youkuaiyun.com/v_july_v/article/details/6870251。关于此100道面试题的所有一切详情,包括答案,资源

结构之法 算法之道 24万+

递归

什么是递归 递归的定义 在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。 任何间接递归都可以等价的转换为直接递归。 如果一个递归过程或递归函数中递归调用语句是最后一句执行语句,则称这种递归调用为尾递归。 例:设计求n!的递归算法。 int fun(int n) { if(n==1) ...

giaming的博客日志 3002

递归算法讲解

一. 引子   大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归。毋庸置疑地,递归确实是一个奇妙的思维方式。对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓、灵活地运用递归思想来解决问题却并不是一件容易的事情。在正式介绍递归之前,我们首先引用...

有趣的人生 一半是山川湖海 一半是初心情怀 6705
上一篇: Codeforces Round #674 (Div. 3)A-F题解
下一篇: Grakn Forces 2020A-F题解
StandNotAlone
博客等级 码龄7年 338粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值