Si vous êtes intéressé à générer (lexicalement) commandé partitions entières, soit des ensembles non ordonnés uniques de S entiers positifs (pas des 0) cette somme à N, puis essayez ce qui suit. (désordonné signifie simplement que [1,2,1] et [1,1,2] sont la même partition)
Le problème n'a pas besoin de récursivité et est rapidement traité car le concept de recherche de la partition restreinte lexicale suivante est en fait très simple ...
En cours: À partir du dernier ajout (entier), recherchez la première instance où la différence entre deux addenda est supérieure à 1. Divisez la partition en deux à ce stade. Supprimer 1 de l'entier supérieur (qui sera le dernier entier dans une partie) et ajouter 1 à l'entier inférieur (le premier entier de la dernière partie). Recherchez ensuite la première partition lexicale ordonnée pour la dernière partie ayant le nouvel entier le plus grand comme valeur d'ajout maximale. J'utilise Sage pour trouver la première partition lexicale parce qu'elle s'éclaircit rapidement, mais c'est facile à faire sans elle. Enfin, rejoignez les deux parties et voilà! Vous avez la partition lexicale suivante de N ayant des parties S.
par exemple. [6,5,3,2,2] -> [6,5], [3,2,2] -> [6,4], [4,2,2] -> [6,4], [ 4,3,1] -> [6,4,4,3,1]
Donc, en Python et en appelant Sage pour la tâche mineure de trouver la première partition lexicale donnée parties n et s ...
from sage.all import *
def most_even_partition(n,s): # The main function will need to recognize the most even partition possible (i.e. last lexical partition) so it can loop back to the first lexical partition if need be
most_even = [int(floor(float(n)/float(s)))]*s
_remainder = int(n%s)
j = 0
while _remainder > 0:
most_even[j] += 1
_remainder -= 1
j += 1
return most_even
def portion(alist, indices):
return [alist[i:j] for i, j in zip([0]+indices, indices+[None])]
def next_restricted_part(p,n,s):
if p == most_even_partition(n,s):return Partitions(n,length=s).first()
for i in enumerate(reversed(p)):
if i[1] - p[-1] > 1:
if i[0] == (s-1):
return Partitions(n,length=s,max_part=(i[1]-1)).first()
else:
parts = portion(p,[s-i[0]-1]) # split p (soup?)
h1 = parts[0]
h2 = parts[1]
next = list(Partitions(sum(h2),length=len(h2),max_part=(h2[0]-1)).first())
return h1+next
Si vous voulez des zéros (pas des partitions entières réelles), alors les fonctions n'ont besoin que de petites modifications.
est-il des devoirs? – Jack
-1: Qu'avez-vous essayé? Les questions de devoirs sont acceptables si vous admettez que la question se rapporte aux devoirs et que vous avez fait une tentative de bonne foi pour résoudre le problème vous-même d'abord. http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework-questions/10812#10812 –
seuls les entiers positifs? car avec les négatifs, ce serait infini ... –