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 !
Table des matières
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 :
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 :
- Lien de téléchargement GitHub : Portail
- Lien vers le texte original : Lire le texte original
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 !