文档章节

递归的应用

Cynthia_x
 Cynthia_x
发布于 2016/11/21 18:34
字数 702
阅读 42
收藏 0

1. 设计一个算法并编程实现,将一个正整数划分成多个正整数的加和,并把所有的结果组合输出。

分  析: 正整数的划分就是把一个正整数n,写成多个大于等于1且小于等于其本身的整数的和,其中各加数所构成的集合为n的一个划分,这是一个典型的递归算法。即:

 一个正整数被划分成多个正整数,划分组合的成员个数最多是这个正整数的大小,最少是这个正整数本身。而且在递归的过程中还要传递上层的划分数字,要求划分的后一个数字大于等于前一个,使无序的划分方式变为有序,去掉重复项。

代码实现: 

#include <stdio.h>
int mark[10]; //定义全局变量 
int n;
void Divide(int now,int k,int pre){
   int i;
   if(now>n) return;
   if(now==n){
        for(i=0;i<k-1;i++)
          printf("%d+",mark[i]);
    printf("%d\n",mark[i]);
   }
   else{
     for(i=pre;i>0;i--){
        if(i<=pre){
           mark[k]=i;
           now+=i;
           Divide(now,k+1,i); //递归调用函数 
           now-=i;
        }
     }
   }

int main(void){
   scanf("%d",&n);
   Divide(0,0,n-1);
   return 0;
}

运行结果

 

2. 设计一个算法并编程实现,对一组数的全排列,并将所有的排列结果输出。

分 析 :   对于全排列问题,f(n)=n!(定义0!=1),其中需要用到函数的递归调用,在调用中,序列中的某两个元素需要不断地交换位置,在输出时调用一次,满足条件即可输出,是一种情况。一组数的全排列组合的个数为n!,通过先序递归将这一组数存入新的数组中,递归的过程中需要判断新放入的数在数组中是不是存在,如果存在,就不能被放入数组中,如果不存在,则可以放入数组,递归一次,在数组中放入一个数。递归四次则输出一次,输出完成后递归回退,进行穷举。R的全排列可归纳定义如下:

当n=1时,Perm(R)=(r),其中r是集合R中唯一的元素;

当n>1时,Perm(R)由(r1)Perm(R1),(r2)Perm(R2),......,(rn)Perm(Rn)构成。

代码实现

#include <stdio.h>  
#define N 100
void swap(int *a, int *b){     //功能:交换两个数
    int m;     
     m = *a;     
    *a = *b;     
    *b = m;
}  
void perm(int arr[], int k, int m){     
    int i,n=0;     
    if(k > m){         
        for(i = 0; i <= m; i++)            
            printf("%d ", arr[i]);         
        printf("\n");         
        n++;     
    }     
    else{         
        for(i = k; i <= m; i++){            
            swap(&arr[k], &arr[i]);            
            perm(arr, k + 1, m);    //递归调用        
            swap(&arr[k], &arr[i]);         
        }     
    }
}
int main(void){     
    int n,i,k;
    int arr[N];
    printf("请输入有几个数:\t");
    scanf("%d",&n);
    for(i = 0; i < n; i++)  {
        scanf("%d", &arr[i]);
    }
    perm(arr, 0, n-1);         
    return 0;

运行结果

© 著作权归作者所有

共有 人打赏支持
Cynthia_x
粉丝 0
博文 8
码字总数 8751
作品 0
深圳
前端工程师
私信 提问
PostgreSQL Oracle 兼容性 - connect by 2

标签 PostgreSQL , Oracle , 树形查询 , 递归 , connect by , tablefunc , connectby 背景 Oracle connect by语法经常用于有树形关系的记录查询,PostgreSQL使用CTE递归语法,可以实现同样的...

德哥
10/05
0
0
递归六--判断一个数是偶数还是奇数 -java实现

交互递归: 到目前为止,看到的递归函数都是直接调用自己。虽然大多数的递归函数都符合这一形式,但其实递归的定义更为广泛,如果某个函数被细分成了几个子函数,那么可以在更深的嵌套层次上...

Amui
2015/10/02
6
0
人工智能3:神经网络发展分支介绍

前言:自己要开始学习神经网络,当然要先搞明白神经网络发展过程中出现的分支有哪些,这些分支经过理论上的论证,实际上的操作,不断的完善后发展成现如今的哪些神经网络,以及各自的用处在哪...

zzz_cming
01/21
0
0
每天学习一点儿算法--递归

递归是很多算法都使用的一种编程方法。听说递归是一种十分优雅的问题解决办法,可是对于初涉递归的我,还没有形成这种独特的体会。 学习使用递归的关键在于:如何将问题分为基线条件和递归条...

爱吃西瓜的番茄酱
01/09
0
0
JavaScript专题之递归

JavaScript 专题系列第十八篇,讲解递归和尾递归 定义 程序调用自身的编程技巧称为递归(recursion)。 阶乘 以阶乘为例: 示意图(图片来自 wwww.penjee.com): 斐波那契数列 在《JavaScript专...

冴羽
2017/09/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 哥们之间报恩的想法被上帝实现了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 小小编辑:推荐歌曲《消愁》 《消愁》- 毛不易 手机党少年们想听歌,请使劲儿戳(这里) @过遥 :周一的早上就应该用来补觉,太困了 周末不想...

小小编辑
10分钟前
10
2
MariaDB 服务器在 MySQL Workbench 备份数据的时候出错如何解决

服务器是运行在 MariaDB 10.2 上面的,在使用 MySQL Workbench 出现错误: mysqldump: Couldn't execute 'SELECT COLUMN_NAME, JSON_EXTRACT(HISTOGRAM, '$."number-of-buckets-specified"'......

honeymose
今天
3
0
apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
7
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
18
1
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部