Partage
  • Partager sur Facebook
  • Partager sur Twitter

calculer la longueur d'une chaîne

de manière récursive

Sujet résolu
Anonyme
7 avril 2011 à 21:58:29

Bonjour à tous !

J'essaye d'écrire une fonction récursive clength renvoyant la longueur d'une chaîne passée en paramètre.
J'ai un peu de mal avec la récursivité en général, mais dans ce cas, je bloque complètement :s.
Mon code ne marche pas car je fais un appel infini de la fonction à cause de l'initialisation du compteur i.
Comment faire?

int clength( char* chaine)
{
	int i;
	for(i=0; *chaine != '\0'; i++)
	{
		i++;
		clength(chaine + 1);	
	}
	return i;
}


Merci d'avance pour vos réponses :)
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 22:01:04

La récursivité permet généralement d'éviter les boucles.
Essaye donc de faire sans.

Pour une fonction récursive, il faut :
- un point d'arrêt.
- au moins une donnée qui décroit strictement entre deux appels récursifs.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 avril 2011 à 22:04:14

Et ben j'ai rien de mieux à proposer ^^
Sinon pour le principe, je connais, j'ai les cours devant moi :p
C'est dans l'application, et surtout dans ce cas précis que ça bloque.
(Après mon code, c'était pour proposer quelque chose quoi ^^)
Un peu d'aide ne serait pas de refus :)
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 22:07:24

Allez, un peu d'aide :

- Le point d'arrêt, c'est le caractère '\0'.
- La donnée qui diminue strictement, c'est la longueur de la chaîne.

Et utilise le formalisme pointeur plutôt que tableau.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 avril 2011 à 22:11:05

Bon alors je voudrais bien beaucoup d'aide s'il te plait ^^
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 22:12:01

Tu veux un code tout fait, ou tu veux réfléchir ?

#include <stdio.h>

int len(char *_)
{
	return (*_) ? 1 + len(++_) : 0;
}
main()
{
	printf("%d\n", len("abcdefgh"));
}
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 avril 2011 à 22:15:52

merci beaucoup, je vais étudier ça :)
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 22:17:15

De l'aide.
Pour calculer la longueur d'une chaîne, tu fais :

int i;
for (i = 0; chaine[i] != '\0'; i++)
;
return i;

Dans ton for, tu as (initialisation; condition; incrémentation)
L'initialisation correspond à la dernière étape de ta récursion.
La condition est ta condition d'arrêt de ta récursion.
L'incrémentation se fait à la récupération de la valeur renvoyée de la fonction récursive.

Si je t'en dis plus, je te donne la solution. :-°

Edit: Tosh, t'es trop gentil. :'(
Aller, la mienne :

int len(char*a){
  return 0?*a?len(0):(1+0)<<8:1?*a?len(++a)+1:(2*-1+2):(3-2);
}
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 avril 2011 à 22:29:02

Merci beaucoup pour vos réponses :)
Bon comme j'ai rien compris à l'utilisation des ternaires dans vos exemples, je vais investiguer un peu :p

  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 22:33:04

Haha, c'est vraiment galère à lire les ternaires imbriqués...

En tout cas, il est bien camouflé ton code :) . (mais j'ai vu pire :p )
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 avril 2011 à 22:37:53

Dommage que Champolion soit mort :p
(j'plaisaaante ^^)
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 22:45:01

Pouet, va te faire soigner :lol:
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 avril 2011 à 22:53:20

Bon, si je peux me permettre une autre petite question ^^

là dedans :
return (*_) ? 1 + len(++_) : 0;

la condition c'est la valeur à l'adresse du pointeur entre parenthèses, mais concrètement ça représente quoi? Un booléen vrai si on à une valeur autre que '\0' ??
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 22:55:39

En C, tout ce qui n'est pas nul est vrai, faux sinon.
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 23:00:41

Citation : Arthurus

Pouet, va te faire soigner :lol:


Pourquoi ? xD
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
7 avril 2011 à 23:03:01

Un grand merci pour toutes vos réponses, j'ai tout compris ça y est:)
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 23:06:27

Rien que pour le code que tu as donné, on devrait te pendre pour avoir un esprit aussi tordu :D (haha, j'aim bien ton 1+0)
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 23:09:00

Bah, j'ai rien fait en fait, j'ai fait le même code que Tosh finalement ! xD
Tu vires juste les 0? et les 1 qui servent à rien et c'est bon ! xD
  • Partager sur Facebook
  • Partager sur Twitter
7 avril 2011 à 23:14:23

Je sais que tu sais ! xD
C'était histoire de dire quelque chose. xD
  • Partager sur Facebook
  • Partager sur Twitter
7 février 2023 à 20:33:40 - Message modéré pour le motif suivant : Merci d’utiliser le bouton code pour inséré un code sur le forum


8 février 2023 à 1:44:14

@anaselamouri:
D'abord, tu as déterré un sujet vieux de 2011.
Ensuite ton code ne pourra pas compiler.
Puis tu te retrouveras dans une boucle infinie si tu corriges tes entêtes.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

8 février 2023 à 8:39:27

@anaselamouri Bonjour, merci de ne pas squatter le sujet des autres, créer votre sujet dans le respect des règles du forum à savoir qu'un message commence par des règles de politesses (Un bonjour ou des salutations à la communauté et se termine par des remerciements par avances pour les futures réponses), la description de votre problème et le code que vous avez écrit inséré sur le forum à l'aide de l'outil d'intégration de code soit le bouton code </>.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter