经典递归问题

运用递归解决问题的要点:

(1)缩小问题规模(将问题分为若干步,注意构造问题间的相似性)

(2)分析递归出口

下面从一些经典的实例来分析递归问题的特征

1.从n个小球中取m个,问有多少种取法?

 1 #include <iostream>
 2 using namespace std;
 3
 4 int f(int n,int m){
 5     if(n<m) return 0;
 6     if(m==0) return 1;
 7     return f(n-1,m)+f(n-1,m-1);
 8 }
 9 int main(){
10     int n,m;
11     cin>>n>>m;
12     cout<<f(n,m);
13 }

2.打印字符串的全排列

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 void f(string str,int k)
 7 {
 8     if(str.length()-1==k){
 9         cout<<str<<endl;
10         return;
11     }
12     for(int i=k;i<str.length();i++){
13         swap(str[k],str[i]);
14         f(str,k+1);
15         swap(str[k],str[i]);
16     }
17 }
18 int main()
19 {
20     string str="abc";
21     f(str,0);
22     return 0;
23 }
时间: 2024-12-15 01:42:31

经典递归问题的相关文章

经典递归问题总结

   深入了解和掌握递归问题是一个高效程序员的基本素养,无论在平时课程学习或者竞赛中,递归思想的地位举足轻重,故在此对一些经典递归问题进行一些总结. (1)  计算一个数组中元素的累加和 #include<stdio.h>   intaddAll(int a[],int begin,int end); intmain(){ int a[6]={3,5,1,6,34,67}; int sum=0; //计算a数组的累加和 sum=addAll(a,0,5);  printf("%d\n

从&quot;汉诺塔&quot;经典递归到JS递归函数

前言 参考<JavaScript语言精粹> 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归函数就是会直接或者间接调用自身的一种函数,一般来说,一个递归函数调用自身去解决它的子问题. "汉诺塔"经典递归问题 "汉诺塔"是印度的一个古老传说,也是程序设计中的经典的递归问题,是一个著名的益智游戏: 题目如下: 塔上有三根柱子和一套直径各不相同的空心圆盘,开始时源柱子上的所有圆盘都按从大到小的顺序排列.目标是通过

递归算法及经典递归例子代码实现( 转自http://www.cnblogs.com/joinclear)

递归(recursion):程序调用自身的编程技巧. 递归满足2个条件: 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 递归例子: (1)阶乘 n! = n * (n-1) * (n-2) * ...* 1(n>0) //阶乘 int recursive(int i) { int sum = 0; if (0 == i) return (1); else sum = i * recursive(i-1); return sum; } (2)河内塔问题 //河内塔 v

递归算法及经典递归例子代码实现

转自http://www.cnblogs.com/joinclear/archive/2013/02/06/2908247.html 递归(recursion):程序调用自身的编程技巧. 递归满足2个条件: 1)有反复执行的过程(调用自身) 2)有跳出反复执行过程的条件(递归出口) 递归例子: (1)阶乘 n! = n * (n-1) * (n-2) * ...* 1(n>0) //阶乘 int recursive(int i) { int sum = 0; if (0 == i) return

经典递归集合

1.放苹果--[①2020-02-07] 题目大意:他一共有n个口罩和m个盒子,每个盒子可以放任意个口罩(允许空着) 现在他想问你一共有多少种放口罩的方案? Hint: 1 2 2 和 2 1 2 是同一种分配方案 分情况讨论: 1.n=0,没有口罩,那么只有一种放法,即f(0,m)=1 2.m=1,只有一个盒子中,不论有或者无口罩,那么只有一种放法,f(n,1)=1 3.m>n,和m个口罩放在m个盒子中是一样的,即f(n,m)=f(n,n) 4.n>=m,这时分为两种情况,一是所有盒子都有口

经典递归小程序--汉诺塔

#include <stdio.h> /* 思路:1.将1到n-1号盘子借助C移到B上 2.将n号盘子移到C上 3.将1到n-1号盘子借助A移到C上 */ //初始化步数 int i = 0; void move(int,char,char); void hannuota(int,char,char,char); void main(void){ int n; printf("请输入汉诺塔盘子的个数:"); scanf("%d",&n); han

算法设计方法:递归的内涵与经典应用

摘要: 大师 L. Peter Deutsch 说过:To Iterate is Human, to Recurse, Divine.中文译为:人理解迭代,神理解递归.毋庸置疑地,递归确实是一个奇妙的思维方式.对一些简单的递归问题,我们总是惊叹于递归描述问题的能力和编写代码的简洁,但要想真正领悟递归的精髓.灵活地运用递归思想来解决问题却并不是一件容易的事情.本文剖析了递归的思想内涵,分析了递归与循环的联系与区别,给出了递归的应用场景和一些典型应用,并利用递归和非递归的方式解决了包括阶乘.斐波那契

汉诺塔问题(递归之路)

经典递归问题----汉诺塔问题 #include <stdio.h>#include <stdlib.h> void move(int i, int from, int to){ printf("move %d from %d to %d\n", i, from, to);}void hanoi(int n, int from, int help, int to){ //use 'help' to move 'from' to 'to'. if(n == 1){

php 经典的算法题你懂的

有5个人偷了一堆苹果,准备在第二天分赃.晚上,有一人遛出来,把所有菜果分成5份,但是多了一个,顺手把这个扔给树上的猴了,自己先拿1/5藏了.没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的那一个扔给了猴,偷走了1/5.第二天,大家分赃,也是分成5份多一个扔给猴了.最后一人分了一份.问:共有多少苹果? for ($i = 1; ; $i++) {     if ($i%5 == 1) {         //第一个人取五分之一,还剩$t         $t = $i - round(