文档章节

递归的应用

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递归语法,可以实现同样的...

德哥
2018/10/05
0
0
人工智能3:神经网络发展分支介绍

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

zzz_cming
2018/01/21
0
0
递归六--判断一个数是偶数还是奇数 -java实现

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

Amui
2015/10/02
6
0
try catch无法捕获 StackOverflowException

在以前版本的 .NET Framework 中,您的应用程序可以捕获 StackOverflowException 对象(例如,从无限递归恢复)。 但是,现在我们建议不要使用这种做法,原因是需要大量附加代码才能可靠地捕...

C_Sharp大大
2013/08/17
0
0
C# -- 使用递归列出文件夹目录及目录下的文件

使用递归列出文件夹目录及目录的下文件 1.使用递归列出文件夹目录及目录下文件,并将文件目录结构在TreeView控件中显示出来。 新建一个WinForm应用程序,放置一个TreeView控件: 代码实现:在...

在代码的世界里游走
2018/10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
3
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
6
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部