2016-03-30 1 views
0

J'essaie de trouver le nombre de lettres minuscules/supérieures dans une chaîne, mais il y a un problème avec mon code:Comment trouver le nombre de minuscules dans Scheme Racket?

(define case 
    (lambda (list) 
    (if(char-lower-case? (car list)) 
     (case (cdr list)) 
     (+ 1 (case (cdr list))) 
     ) 
    )) 

(case (string->list "ScheMe")) 

Comment puis-je résoudre ce problème?

+0

Veuillez préciser quel est exactement le problème avec votre code. – honk

+0

si la première lettre de la chaîne est en minuscule, le programme ne renvoie pas le cas (cdr list)). Je ne vérifie pas toute la chaîne. – Ersin

+0

I résolu, la solution est la suivante:? (Définie cas (lambda (liste) (if (null liste) (si (char-majuscules (liste des voitures)) (cas (liste de CDR)) (+ 1 (case (liste cdr))) ) ))) (case (chaîne-> liste "SeheMe")) – Ersin

Répondre

0

Dans votre fonction que vous avez deux problèmes:

  1. case est un opérateur prédéfini en raquette/système

  2. Vous ne testez pas une liste vide.

De plus, vous utilisez le paramètre list, qui est un opérateur primitif et ne doit pas être utilisé comme nom de variable.

est ici une fonction de travail:

(define (case1 lst) 
    (cond ((null? lst) 0) 
      ((char-lower-case? (car lst)) (case1 (cdr lst))) 
      (else (+ 1 (case1 (cdr lst)))))) 

(case1 (string->list "ScheMe")) 
0

Votre code n'a pas de cas de base. (case '()) devrait évaluer à 0 mais vous obtenez une erreur puisque vous faites car et cdr sur nil.

D'autres choses qui pourraient être mal:

Votre titre indique que vous voulez compter les lettres minuscules, mais vous augmentez pour chaque majuscule.

list et case sont des noms de la bibliothèque standard. Pour R5RS, cela signifie un comportement indéfini et pour R6RS et plus tard cela signifie que les liaisons de bibliothèque ne seraient pas disponibles. En #!racket (je suppose que vous utilisez cette langue depuis que vous avez étiqueté la raquette) cela fonctionne comme R6RS.