2009-04-24 8 views
0

Maintenant que j'utilise la récursivité pour calculer la somme des nombres, je veux faire quelque chose de légèrement différent. Ce qui suit est mon code qui va additionner les nombres 1,2,3,4,5. Comment est-ce que je modifierais mon code pour placer les nombres 1, 2, 3, 4, 5 dans un tableau et puis l'emploierions dans la méthode de récursion? J'ai essayé tant de tentatives différentes et il me manque apparemment quelque chose. Je sais que dans la méthode de récurrence, que je veux utiliser la propriété Length du tableau pour le contrôler.Utilisation de tableaux avec récursivité

Susan

static void Main(string[] args) 
    { 
     Console.WriteLine(Sum(5)); 
     Console.Read(); 
    } 

    static int Sum(int value) 
    { 
     if (value > 0) 
     { 
      return value + Sum(value - 1); 
     } 
     else 
     { 
      return 0; 
     } 
    } 
+1

OK, apparemment, nous faisons les devoirs des gens pour eux :( –

+1

@Paul: Je suppose que le 15 rep pour la coche "accepté" (plus les upvotes on peut obtenir) sont juste tentant – Tomalak

Répondre

2

Sniff, sniff, odeurs comme devoirs pour moi.

Cependant, un indice. Ajouter tous les éléments d'un tableau de longueur 'n' revient à ajouter tous les éléments d'un tableau de longueur 'n-1', puis ajouter la valeur de l'élément 'n'.

Le résultat de l'addition de tous les éléments d'un tableau de longueur « 1 » est juste la valeur de l'un élément

1

Je crois que vous devez passer le tableau et l'indice dans votre fonction Somme à contrôler la récursivité.

3

Qu'en est-il en utilisant un Stack:

Stack<int> stack = new Stack<int>(new int [] {1,2,3,4,5}); 
Console.WriteLine(SumStack(stack)); 

public static int SumStack(Stack<int> input) 
{ 
    return input.Count > 0 ? input.Pop() + SumStack(input) : 0; 
} 
+2

Trop de nouveaux concepts d'erreur. ;-) – Tomalak

0

Vous êtes désireux d'effectuer une opération qui est communément appelé « pli » a.k.a. « réduire ».

Heureusement, l'équipe .NET a fait votre (home) travail pour vous!

static int sum(int[] values) 
    { 
     return values.Aggregate<int>((hd, tl) => hd + tl);    
    } 

Vous pouvez le réécrire pour une meilleure lisibilité si vous le souhaitez. ;)

EDIT: Exemple d'utilisation

int[] values = new int[]{1,2,3,4,5}; 
Console.WriteLine(sum(values)); 
+1

Puisque System.Array implémente IEnumerable, vous n'avez pas besoin de convertir le tableau en List, et le paramètre type de la méthode Aggregate peut être déduit par le compilateur: return values.Aggregate ((hd, tl) = > hd + tl); – CMS

+0

Doh, vous avez absolument raison. Je ne sais pas ce que je pensais là.Edité pour refléter votre point. – dss539

0

de si votre pas bon avec des expressions lambda ou vous avez seulement .net 2.0, cela est assez simple;

static void Main(string[] args) 
{ 

    int[] myArray = new int[5] {1,2,3,4,5 }; 

    Console.WriteLine(Sum1(myArray)); 
    Console.Read(); 

} 

private static int Sum1(int[] myArray) 
{ 

    if (myArray.Length > 0) 
    { 
     int lengthZeroAdjusted = myArray.Length - 1; 
     int element = myArray[lengthZeroAdjusted]; 

     Array.Resize<int>(ref myArray, lengthZeroAdjusted); 
     return element + Sum1(myArray); 
    } 
    else 
    { 
     return 0; 
    } 
} 
+0

Donc, dans cette méthode, nous passons le tableau myArray. Ensuite, nous définissons la longueur ZeroAdjusted à myArray.Length - 1 qui serait 5 - 1 (4). Quelle est exactement la ligne suivante utilisée pour: Array.Resize (ref myArray, lengthZeroAdjusted); Susan –

+0

Salut là Susan :) Je pense que vous aviez besoin de quelque chose dans le même sens que votre exemple initial afin de faciliter la compréhension. Je suppose que comme d'autres ici, vous pourriez être nouveau à la programmation. Toutes mes excuses si vous n'êtes pas d'accord. Afin que la fonction reste fidèle au type 'array' que vous avez demandé, j'ai simplement maintenu le type. Ce faisant, nous traitons le type de tableau légèrement différemment de certaines autres suggestions. –

+0

Pour décrire ce qui est nécessaire de manière verbeuse, de sorte que toute la fonction soit un tableau, il faut que nous modifiions le tableau chaque fois que nous réécrivons. Similaire à la pile http://en.csharp-online.net/Generic_Stack fonctionnellement. Nous prenons la dernière valeur dans le tableau et la stockons dans l'élément, nous pouvons maintenant réduire la taille du tableau de 1, en passant lengthZeroAdjusted dans lequel sera toujours 1 de moins que myArray. –

5
let seq = [1;2;3;4;5] 

let rec samp nums = 
    match nums with 
    | []  -> 0 
    | h::t -> h + samp t 
+1

J'aime celui-ci. Totalement irrecevable pour l'OP de soumettre ceci comme réponse de devoirs, compte tenu du niveau d'expérience montré la question originale :) –

+0

Je voulais lui donner un indice, sans lui donner la réponse :) –

+0

OK, je mords. Par curiosité, pour ma culture, quelle langue est-ce? Un certain langage fonctionnel à coup sûr, mais il y en a tellement ... :-) – PhiLho

0

Recursion signifie essentiellement faire la petite partie, et de donner la plus grande partie à quelqu'un d'autre. Maintenant, si vous avez à 'n' éléments de tableau, vous demandez à quelqu'un de vous donner la somme des derniers éléments n-1, et juste le premier vous-même ... juste gérer le cas où il n'y a rien à faire ...

un code pseudo serait:

sum array start_index = if (start_index >= length(array)) return 0 
           else return array[start_index] = sum array (start_index + 1) 

    print (sum array 0) 
3
static int Sum(int[] a, int index = 0) 
{ 
    if (a[index] == a[a.Length - 1]) 
    { 
     return a[a.Length - 1]; 
    } 
    return a[index] + Sum(a, index + 1); 
} 

static void Main() 
{ 
    int[] arr = {1, 2, 3, 9, 15}; 
    Console.WriteLine(Sum(arr)); 
} 

Je suis un débutant aussi, mais c'est ma solution et il fonctionne pour moi.

Questions connexes