2010-09-21 10 views
0

Je suis censé écrire une fonction système (chiffres de comptage n) qui accepte un entier positif n et évalue le nombre de chiffres de n qui sont 6, 4 ou 9.Scheme Comprendre

J'ai J'ai du mal à comprendre ce que je suis censé faire exactement, je suis confus au sujet des «chiffres de n qui sont 6, 4 ou 9», qu'est-ce que cela signifie?

+1

Cela semble être une excellente question pour votre professeur. Cependant, je pense que vous devez supprimer tous les nombres qui ne sont pas 6, 4 ou 9. Donc, le résultat de l'entrée 61144119 serait 4, 6449. Vous devriez commencer par convertir votre entrée en une chaîne. – linuxuser27

+1

@ linuxuser27 Rien sur le nom «nombre de chiffres» implique que les chiffres doivent être supprimés. Cette question de devoirs peut être faite en utilisant seulement des maths. – erjiang

+0

@erjiang - Je marchais le PO à travers le concept de ce que je pensais que le professeur demandait. Les chiffres dans le nombre qui sont 6, 4, 9. S'il vous plaît dites-moi comment vous feriez cela sans convertir 61144119 en une chaîne ou une liste dans le schéma. Considérant que chaque solution utilise cette approche. – linuxuser27

Répondre

4

Ceci est juste une question d'interprétation, mais je dirais que vous prendriez la représentation décimale d'un nombre, et compter le nombre total de chiffres qui sont 6, 4 ou 9. Par exemple:

  • 100 -> 0
  • 4 -> 1
  • 469 -> 3
  • 444 -> 3

Météo rapide?

0

Une interprétation - par exemple:

Compte tenu 678799391, le nombre de chiffres serait 0 pour 4, 1 pour 6 et 3 pour 9. La somme des occurrences serait 0 + 1 + 3 = 4.

0

Convertissez le nombre entier en liste et vérifiez-les individuellement.

(define (number->list x) 
    (string->list (number->string x)) 

(define (6-4-or-9 x) (cond ((= x 6) true)) ((= x 4) true)) ((= x 9) true)))) 

(define (count-6-4-9 x) (cond ((6-4-or-9 (car (number->list x))))....... 

Je suis sûr que vous pouvez voir où cela se passe. C'est assez grossier, et je ne suis pas sûr que ce soit vraiment idiomatique, mais ça devrait marcher. L'idée est que vous convertissez le nombre en une liste, cochez le premier chiffre, s'il est six, quatre ou neuf, appelez de façon récursive la procédure sur le cdr de la liste de numéros convertie en une chaîne + 1 .. .

+0

Votre code serait mieux lorsqu'il est formaté. – miku

+0

Mieux vaut utiliser 'ou' au lieu de' cond'. Encore mieux - utilisez 'member'. Aussi - 'string-> list' renvoie une liste de caractères, donc vous devriez utiliser' # \ 6' etc, pas '6'. –

+0

Merci Eli! Je suis encore un peu novice, je parie que vous pouvez le dire! –

0

Si vous n'utilisez pas les listes, vous pouvez travailler avec modulo % 10 et diviser des nombres entiers / avec 10.

Voici la solution récursive:

(define (digits n) 
(if(not (< n 1)) (+ 1 (digits (/ n 10))) 0)) 
0

Tout d'abord, nous devons comprendre wha La question est la suivante: Il vous demande d'écrire une procédure qui compte le nombre de fois que les chiffres 4, 6 ou 9 apparaissent dans un autre nombre entré. Par exemple, la saisie 10345 doit renvoyer 1. Voyons pourquoi:

Les chiffres de 10345 sont 1, 0, 3, 4 et 5. Nous devons demander: «Combien de fois 4, 6, ou 9 apparaissent? Eh bien, il n'y a pas 6 ou 9 dans 10345. Cependant, il y en a un 4. Par conséquent, la procédure doit renvoyer 1.

Un autre exemple: (digit-count 14289)

Brisons vers le haut comme nous l'avons fait auparavant.Les chiffres de 14289 sont 1, 4, 2, 8 et 9. Il n'y a pas de 6. Il y a, cependant, 1 et 9. Combien? Il y en a un 1 et un 9. Comme il y a deux (total) des chiffres désirés présents (les chiffres désirés sont 4, 6, et 9), (digit-count 14289) devrait renvoyer 2.

Quelques exemples:

(digit-count 144) ->2 (il y a deux 4 's

(digit-count 1) ->0 (il n'y a pas 4)' s, 6 's, ou 9' s)

(digit-count 1262) ->1 (il y a un 6)

Maintenant, commençons à définir. Nous pouvons tirer parti de la fonction appearances, qui prend deux entrées et retourne combien de fois la première entrée apparaît dans la seconde. Par exemple: (appearances 'a 'amsterdam) renvoie 2 car il y a deux a dans amsterdam.

En utilisant appearances, voici notre définition (enfin!):

(define (count469 num) 
    (+ (appearances 4 num) 
    (appearances 6 num) 
    (appearances 9 num))) 

Cette fonction retourne la somme des appearances de 4, le appearances de 6 et le appearances de 9. S'il vous plaît ne hésitez pas à répondre avec des commentaires ou des questions!