随手练——几个递归小题目

递归最重要的两点:

1.base case(递归出口)。必须有某些基本情形,它无需递归就能解出。

2.分解 或者 分类。分解成子问题,或者每层递归分叉,也就是一个N叉树模型。

 例题:

  • 打印一个字符串的所有子串

分解:按顺序每个字母是否打印,分解。

base case: 当 pos==length,分解到了最后一步

void process(char *s,int pos,int length,string res) {
    if (pos == length) {
        cout << res << endl;
        return;
    }
    process(s, pos + 1,length,res);
    process(s, pos + 1, length, res + s[pos]);
}
int main() {
    char str[] = "abc";
    process(str, 0, 3,"");
    return 0;
}
  • 打印一个字符串的全排列

void process(string s,int n) {
    if (n == s.length()) {
        cout << s << endl;
        return;
    }
    for (int i = n; i < s.length(); i++) {
        swap(s[i],s[n]);
        process(s,n+1);
    }
}
  • 给定一个数组,数组中元素能否累加得到 指定值aim

要注意带返回值的递归函数写法:

bool recur(int *a, int n,int res,int aim,int length) {
    if (n == length || res == aim) {
        return res == aim;
    }
    return recur(a, n + 1, res + a[n], aim,length)|| recur(a, n + 1, res, aim,length);
}
  • 不是所有题目都适合用递归

比如:HDU 2018:http://acm.hdu.edu.cn/showproblem.php?pid=2018

两种解法,虽然递归解法要短很多,但是时间上,填表要快很多,因为递归会重复计算已经算过的值:

#include <iostream>
using namespace std;
int a[55];
int f(int n) {
    if (n <= 4) return n;
    return f(n - 1) + f(n - 3);
}
int main() {
    int n;
    a[1] = 1; a[2] = 2; a[3] = 3; a[4] = 4;
    for (int i = 5; i < 55; i++) {
        a[i] = a[i - 1] + a[i - 3];
    }
    while (cin >> n) {
        if (n == 0)break;
        cout << a[n]<< endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/czc1999/p/10357290.html

时间: 2025-01-05 17:44:51

随手练——几个递归小题目的相关文章

每日一小练——数值自乘递归解

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:数值自乘递归解 内容:如果一个n与m是正整数,那么m^n就是把m连乘n次,这是一个很没有效率的方法.试试编写一个更有效率的程序,应该以少量n-1个乘法作为设计标准. 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了!解决递归的问题,其实关键在于找到合理的递归公式,公式只要找到问题就迎刃而解了.这个题目说的是自乘,所以底数是不变的,指数上无非就3中情况,奇数,偶数和零.奇

递归小题中的空间换时间思想

题目: 如数: 1  1  2  3   5   8   13   21  34  55 ...... 序号: 0  1  2  3   4   5   6     7    8    9 ...... 由用户输入序号,输出对应的数值. 效果: 实现代码: #include <stdio.h> int bian(int num); //static int shu[100]={1,1}; int main() { int num; while ( printf("请输入编号数:&qu

随手练——数独 HDU - 5547 坑!坑!坑!

题目链接:HDU-5547 http://acm.hdu.edu.cn/showproblem.php?pid=5547 解题思想:随手练-- 数独 POJ - 2676 (回溯法+DFS) HDU 的这题实在是太坑了,M 数组开成 int 就过不了,改成 char 就过了.对着别人AC的代码,一点点试,到最后才试出来,数组的问题,但是不能理解啊,什么鬼,这也错?? 然后发现题目描述里有一句:Each test case starts with an empty line followed by

【C++】【一日一练】读写文件小实例【20140510】

需要反省,说好一日一练的,昨天周五就偷懒出去逛了逛...吾当一日三省吾身... 今天的练习是写一个小程序,需要用到文件的读写,不过越写越长,又用到了很多乱七八糟的内置类什么的,就当是复习了吧,大概涉及到以下几个知识: enum fstream stringstream vector 渣程序如下: #include <iostream> #include <fstream> #include <string> #include <sstream> // str

四则运算小题目解析

小题目四则运算下面是源代码 #include <iostream> using namespace std; void main() {  int X0[1000],Y0[1000],Z0[1000],X1[1000],Y1[1000],Z1[1000],X2[1000],Y2[1000],Z2[1000],X3[1000],Y3[1000],Z3[1000],A[1000],a,b,c;  int i,j,A0,A1,A2,A3,B0,B1,B2,B3;  int number1,numbe

考考你!一道有趣的Javascript小题目

今天的内容很简单,给大家分享一个有趣的Javascript小题目. 题目很简单,就是填空: var a = ______; var b = a;alert(a==b); // alert "false" 请将程序补充完整,使得弹出的对话框显示为"false". 先答出的有奖哦 ^ ^ --------------------- 用简单而风趣的形式表达出自己的想法是我一直追求的目标(当然,目前还处于"XX主义初级阶段",还有很长的路要走). 如果你

java 数组小题目

好久好久都没有搞过数组了,今天有个小题目.贴出来打发时间.(老黄牛在天上--)哈哈,不开玩笑啦. ---------看这道题主要是个排序,然后是筛选数组元素.废话不多说,直接贴代码,大神勿喷 ⊙﹏⊙|∣ -------控制台打印结果如下所示: 原文地址:http://blog.51cto.com/12237592/2105000

1251 括号(递归小练)

1251 括号 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 计算乘法时,我们可以添加括号,来改变相乘的顺序,比如计算         X1, X2, X3, X4, …, XN的积,可以 (X1(X2(X3(X4(...(XN-1*XN)...)))))  ::: ::: (((...(((X1*X2)X3)X4)...)XN-1)XN) 你的任务是编程求出所有这样的添括号的方案. 输入描述 Input Descriptio

递归小练

递归练习1: 求2*4*(2n)的积: 五个人选班长,分别是,张三,李四,王五,赵六,冯七总共20个人投票