递归

  1. 使用递归函数生成排列

// output all permutations of n elements
# include <iostream>
using namespace std;

template<class T>
void Perm(T list[], int k, int m)
{// Generate all permutations of list[k:m].
   int i;
   if (k == m) {// list[k:m] has one permutation, output it
                for (i = 0; i <= m; i++)
                   cout << list[i];
                cout << endl;
                }
   else  // list[k:m] has more than one permutation
         // generate these recursively
         for (i = k; i <= m; i++) {
            Swap(list[k], list[i]);
            Perm(list, k+1, m);
            Swap(list[k], list[i]);
            }
}
template<class T>
inline void Swap(T& a, T& b)
{// Swap a and b.
   T temp = a; a = b; b = temp;
}
int main()
{
   char a[] = {'1', '2', '3', '4'};
   int n = 3;
   cout << "The permutations of 123 are" << endl;
   Perm(a, 0, n-1);
   cin.get();
   return 0;
}
java、、
package datastructure;
import java.util.*;

public class Perm {
 public void range(int[] a,int k,int m)
 {
  
  int i;
  if(k==m)
  {
   for( i=0;i<=m;i++)
    System.out.print(a[i]);
   System.out.println();
  }
  else{
   for(i=k;i<=m;i++)
   {
    //tem=a[i];
    //a[i]=a[k];
    //a[k]=tem;
    exchange(a,k,i);
    //这里与C++不同,因为C++那调用了引用,java不是,如果只传入a[i]a[k],对int[] a,数组内部根本没有

    //达到对调两个数的目的,只有连数组一起传进去~~~~~~~
    range(a,k+1,m);
    exchange(a,k,i);
    //tem=a[i];
    //a[i]=a[k];
    //a[k]=tem;
    
   }}
  
 }
 public void exchange(int[] arr,int c,int d)
 {
  int tem;
  tem=arr[c];
  arr[c]=arr[d];
  arr[d]=tem;
 }
 
 
 public static void main(String[] args)
 {
  System.out.println("How many numbers do you want to arrange?INPUT!");
  Scanner in=new Scanner(System.in);
  int n=in.nextInt();
  int[] a=new int[n];
  for(int i=0;i<a.length;i++)
   a[i]=i+1;
  

  
  Perm pe=new Perm();
  pe.range(a, 0,a.length -1);
 }

}

2 试编写一个递归函数,用来输出n 个元素的所有子集。例如,三个元素{a,  b,  c} 的所有子集是:{ }(空集) ,{a}, {b}, {c}, {a, b}, {a, c}, {b, c} 和{a, b, c}。

#include<stdio.h>
/*课后习题里有个求子集的算法,要求用递归
比如:S={a,b,c,d}要求打印出S的所有子集包括空集
我就胡乱写了个,结果相差很大
*/

//  组合+遍历
char ch[100];
void print(int n)
{
    int i;
    printf("{");
    for(i=0;i<n;i++)
        if(i!=n-1)
            printf("%c, ",ch[i]);
        else
            printf("%c",ch[i]);
    printf(" }    \n");
    return ;
}

void dfs(int n,int index,int hou)
{
    char i;
    if(n==index)
    {
        print(index);
        return ;
    }
    for(i=hou;i<4;i++)
    {
        ch[n]=i+'a';
//    if(n<index)
        dfs(n+1,index,i+1);
    }
}
int main()
{
    int i;
    for(i=0;i<=4;i++)
        dfs(0,i,0);
    return 0;
}


 

3.试编写一个递归函数来确定元素x 是否属于数组a[ 0:n- 1 ]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值