回 帖 发 新 帖 刷新版面

主题:全排列的非递归实现

发现这个算法不简单啊,通过观察递归栈还是不容易写.
递归算法为:
#include <stdio.h>
#include <stdlib.h>
void f(int a[],int n,int i);


int main(){
    int a[5]={1,2,3,4,5};
    f(a,5,0);
    system("pause");
    return 0;
}



void f(int a[],int n,int i){
    int k;
    static int count=0;
    int temp;
    if(i==n-1){
        for(k=0;k<n;k++){
            printf("%d ",a[k]);
        }
        count++;
        printf("\n");
        return;
    }
    for(k=i;k<n;k++){
        temp=a[i];
        a[i]=a[k];
        a[k]=temp;
        f(a,n,i+1);
        temp=a[i];
        a[i]=a[k];
        a[k]=temp;
    }
    if(i==0){
       printf("\n\nHas %d",count);
    }
}
        
    
    

回复列表 (共6个回复)

沙发

递归转非递归不是都很容易的,这个就不简单啊

板凳

楼主太厉害了,这个问题我以前想了好久都没解决,佩服呀!!!

3 楼

还是好递归变形....

4 楼

这不就是递归吗?怎么非递归了?真奇怪!

5 楼

//函数原型 void FullArrangement( char* str, void (* visit)( const char* ) );
//函数参数 字符串str中没有重复的字符
//函数功能 visit遍历str中所有字符形成的全排列

#define NULL             ( 0 )
#define MAX_STR_NUM      ( 20 ) //字符串最大长度
#define SwapChar( X, Y ) { char temp = X; X = Y; Y = temp; }

void FullArrangement( char* str, void (* visit)( const char* ) )
{
        char* stack[MAX_STR_NUM];
        int top = 0;
        char* p = str;

        if ( NULL == str )
        {
                return;
        }

        while ( '\0' != *p || top > 0 )
        {

                if ( '\0' != *p )
                {
                        SwapChar( *p, str[top] );
                        stack[top++] = p;  //将要作为首字符的位置入栈
                        p = str + top;     //重新定位p为待排列首位置
                }
                else
                {
                        if ( '\0' == str[top] )
                        {
                                (* visit)( str );
                        }
                        p = stack[--top];
                        SwapChar( *p, str[top] );
                        ++p;
                }
        }
        return;
}

6 楼

翻了翻老底 上面是我以前写过的 有一些错误 重新修改了一下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Permutation( const char* s )
{
        if ( NULL == s )
        {
                return;
        }

        int len = strlen( s ) + 1;
        char* str = ( char* )malloc( len * sizeof( char ) );
        typedef char* StackElem;
        StackElem* stack = ( StackElem* )malloc( len * sizeof( StackElem ) );
        StackElem* top = stack;
        char* head = str;
        char* p = str;
        char temp;

        strcpy( str, s );
        while ( '\0' != *p || top != stack )
        {
                while ( '\0' != *p )
                {
                        temp = *p;
                        *p = *head;
                        *head = temp;
                        *top++ = p;
                        p = ++head;
                }
                if ( '\0' == *head )
                {
                        puts( str );
                }
                p = *--top;
                temp = *--head;
                *head = *p;
                *p++ = temp;
        }
        free( str );
        free( stack );
        return;
}

int main()
{
        Permutation( "ABCD" );
        system( "pause" );
        return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册