2010-05-19 6 views

Répondre

0

Voulez-vous dire cela?

$ python 
Python 2.5.5 (r255:77872, Apr 21 2010, 08:40:04) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> def f(x): 
...  return x>0 and (x%2)+f(x/2) or 0 
... 
>>> f([1, 1, 1, 3]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in f 
TypeError: unsupported operand type(s) for %: 'list' and 'int' 
0

évaluation dans la déclaration return ne diffère pas de l'évaluation dans tout autre lieu. si x est une liste tout cela n'a aucun sens et soulève TypeError. x devrait être un numérique pour que cela fonctionne.

Si x est un nombre, il fonctionnerait comme suit:

  • évaluer déclaration x>0
  • si elle était True retour (x%2)+f(x/2) partie. Ce qui, bien sûr, récursif infiniment
  • si elle était False retour 0
1

Ce code est cassé. Pour les débutants, x>0 est toujours vrai. Mais x%2 et x/2 donnent des erreurs de type.

0

La fonction compte de manière récursive le nombre de 1 dans la forme binaire du nombre x.

Chaque fois que la fonction ajoute des sommes, le bit le plus bas (1 ou 0) avec le nombre de bits d'un nombre sans le dernier bit (divisant par 2 équivaut à 1), ou 0 s'il n'y a plus morceaux.

Par exemple: La fonction retourne 2 à 5 comme une entrée (5 101 est en binaire) La fonction retourne 3 à 13 comme une entrée (13 est 1101 en binaire)