两种方法用Python实现字符的全排列问题(迭代法、递归法)

实现一串数据的全排列是一个非常经典的问题
今天我来分享两种求法
首先是递归法

def all_words_recursive(s, i):
    if i == len(s):
        print(''.join(s))
    else:
        for j in range(i, len(s)):
            s[j], s[i] = s[i], s[j]
            all_words_recursive(s, i + 1)
            s[j], s[i] = s[i], s[j]

然后是迭代法

def factorial_recursion(n):
    if n == 1:
        return 1
    return n * factorial_recursion(n - 1)


def all_words_iterative(letter):
    n = len(letter)
    permutation_list = [0 for i in range(factorial_recursion(n))]
    temporary_list = [letter[0]]

    for temp_x in range(2, n + 1):
        count = 0
        for temp_i in temporary_list:
            for temp_j in temp_i:
                permutation_list[count] = temp_i.replace(temp_j, letter[temp_x - 1] + temp_j)
                count += 1
            permutation_list[count] = temp_i + letter[temp_x - 1]
            count += 1
        temporary_list = [permutation_list[i] for i in range(factorial_recursion(temp_x))]

    for i in temporary_list:
        print(i)

整合版如下

def all_words_recursive(s, i):
    if i == len(s):
        print(''.join(s))
    else:
        for j in range(i, len(s)):
            s[j], s[i] = s[i], s[j]
            all_words_recursive(s, i + 1)
            s[j], s[i] = s[i], s[j]


def factorial_recursion(n):
    if n == 1:
        return 1
    return n * factorial_recursion(n - 1)


def all_words_iterative(letter):
    n = len(letter)
    permutation_list = [0 for i in range(factorial_recursion(n))]
    temporary_list = [letter[0]]

    for temp_x in range(2, n + 1):
        count = 0
        for temp_i in temporary_list:
            for temp_j in temp_i:
                permutation_list[count] = temp_i.replace(temp_j, letter[temp_x - 1] + temp_j)
                count += 1
            permutation_list[count] = temp_i + letter[temp_x - 1]
            count += 1
        temporary_list = [permutation_list[i] for i in range(factorial_recursion(temp_x))]

    for i in temporary_list:
        print(i)


s = 'asd'
print('递归')
all_words_recursive(list(s), 0)
print('迭代')
all_words_iterative(s)

效果图:
在这里插入图片描述

一起学习python,小白指导,教学分享记得私信我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miku丨无形

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值