Conception d'algorithmes Python - machine à états finis par addition binaire

Code source de conception de l'algorithme Python : https://github.com/MakerChen66/Python3Algorithm

Déclaration de copyright : L'originalité n'est pas facile, cet article interdit le plagiat, la réimpression, la contrefaçon doit être étudiée !

1. Addition binaire | Machine à états finis

L'addition de nombres binaires peut se faire comme enseigné à l'école, rappelez-vous juste 1 + 1 = 10 et suivez certaines règles. Il y a beaucoup à dire sur cette arithmétique apparemment simple, par exemple vous pouvez regarder l'implémentation d'un additionneur parallèle, il y a beaucoup de choses intéressantes dedans.

J'ai décidé d'utiliser une implémentation série via une machine à états finis, avec 4 états basés sur des combinaisons de sortie 0/1 et de retenue 0/1 et des groupes de transitions basés sur des bits d'entrée.

La question est : avez-vous vraiment besoin de quatre états ? En fait seuls trois états peuvent être utilisés, que pouvez-vous trouver ?

Implémentation de l'algorithme Python :

import itertools

p0c0 = 0, {
    
    }
p1c0 = 1, {
    
    }
p0c1 = 0, {
    
    }
p1c1 = 1, {
    
    }

# 各进程状态之间的转换
p0c0[1].update({
    
    (0, 0): p0c0, (1, 0): p1c0, 
                (0, 1): p1c0, (1, 1): p0c1})
p1c0[1].update({
    
    (0, 0): p0c0, (1, 0): p1c0, 
                (0, 1): p1c0, (1, 1): p0c1})
p0c1[1].update({
    
    (0, 0): p1c0, (1, 0): p0c1, 
                (0, 1): p0c1, (1, 1): p1c1})
p1c1[1].update({
    
    (0, 0): p1c0, (1, 0): p0c1, 
                (0, 1): p0c1, (1, 1): p1c1})

def add(x, y):
    x = map(int, reversed(x))
    y = map(int, reversed(y))
    z = []
    # 模拟自动机
    value, transition = p0c0
    for r, s in itertools.zip_longest(x, y, fillvalue=0):
        value, transition = transition[r, s]
        z.append(value)

    z.append(transition[0, 0][0])

    return ''.join(map(str, reversed(z)))

print(add('1100100100100', '100100011000'))

Avis:

  • itertools
    est le module itérateur de python, qui fournit des fonctions très utiles pour manipuler des objets itératifs, comme la fonction zip_longest().Les outils fournis par itertools sont assez efficaces et économisent de la mémoire. Grâce à ces outils, vous pourrez créer vos propres itérateurs personnalisés pour un bouclage efficace.
  • zip_longest(it_obj1, …, it_objN,
    fillvalue=None), les fonctions implémentées par sa fonction sont à peu près les mêmes que la fonction zip intégrée (réaliser une correspondance un à un), mais la fonction zip intégrée est basée sur l'objet avec le moins d'éléments, tandis que la fonction zip_longest est basée sur l'élément Le plus d'objets est utilisé comme référence, et les emplacements vides sont remplis avec la valeur de fillvalue
  • map(function,iterable,…) mappera la séquence spécifiée en fonction de la fonction fournie. La première fonction paramètre
    appelle la fonction fonction avec chaque élément de la séquence de paramètres et renvoie une nouvelle liste contenant la valeur de retour de chaque fonction fonction.
  • L'addition binaire commence à l'extrême droite, donc le nombre binaire d'entrée doit être inversé avec la fonction reversed (), puis inversé après l'opération

Résultat de sortie :
insérez la description de l'image ici
comme indiqué sur la figure, le résultat de l'opération d'addition binaire est 10001000111100, le résultat est correct

2. Téléchargement du code source

Téléchargement du code source de conception de l'algorithme Python :

3. Informations sur l'auteur

Auteur : Xiaohong's Fishing Daily, objectif : rendre la programmation plus intéressante !

Compte public WeChat original : " Xiaohong Xingkong Technology ", axé sur le recrutement scolaire (introduction/bijing/face à face), algorithme, crawler, site Web, développement de jeux, analyse de données, traitement du langage naturel, IA, etc., avec impatience à votre attention, laissez-nous grandir et coder ensemble !

Remarque sur les droits d'auteur : cet article interdit le plagiat et la réimpression, et toute violation doit faire l'objet d'une enquête !

Je suppose que tu aimes

Origine blog.csdn.net/qq_44000141/article/details/123167771
conseillé
Classement