Jump to content
jett

Soma Recursiva

Recommended Posts

jett

Olá, estou fazendo um programa que soma recursivamente todos os elementos da direita para esquerda, porém estão acontecendo alguns erros. Vocês poderiam me ajudar?

#include <stdlib.h>
#include <stdio.h>
int criar(A, n){
   int cont = 0;
   while(cont < n){
       A[cont]= cont+1;
   }
   return A;
}
int Soma(k, n, A){
   int s;
   if(k > n){
       s = 0;
   }
   else{
       s = A[k] + Soma(k+1, n, A);
   }
   return s;
}
int main(){
   int n;
   printf("Digite o número de elementos: ");
   scanf("%d", &n);
   int A[n];
   A = criar(A, n);
   int s = Soma(1, n, A);
   printf("Soma: %d", s);
   return 0;
}

Os erros que aparecem:

||In function 'criar':|

|7|error: subscripted value is neither array nor pointer nor vector|

||In function 'Soma':|

|18|error: subscripted value is neither array nor pointer nor vector|

||In function 'main':|

|32|error: incompatible types when assigning to type 'int[(sizetype)(n)]' from type 'int'|

||=== Build finished: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
jett

Ah, havia esquecido de colocar os tipos dos parâmetros, mas agora o resultado está saindo errado, o que eu devo fazer? O código ficou assim:

#include <stdlib.h>
#include <stdio.h>
int Soma(int k, int n, int A[]);
int main(){
   int n;

   printf("Digite o número de elementos: ");
   scanf("%d", &n);
   int A[n];
   int cont = 0;
   int i = n;
   while(cont < n){
       A[cont]= cont+1;
       cont ++;
   }
   //A = criar(A, n);
   int s = 0;
   s = Soma(1, n, A);
   printf("Soma: %d\n", s);
   return 0;
}
int Soma(int k, int n, int A[n]){
   int s;
   if(k > n){
       s = 0;
   }
   else{
       s = A[k] + Soma(k+1, n, A);
   }
   return s;
}

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

o teu problema está aqui :

int Soma(int k, int n, int A[n]){
 // ..
 if(k > n) {

se tens 5 elementos no array, o último índice válido é 4, no entanto, quanto k = 5, não estás a parar a recursividade

----------

como o teu código está válido (tirando o bug apresentado) vê agora como a quantidade de código desnecessário que tens é descomunal ...


#include <stdio.h>

unsigned int Soma(unsigned int n) {
if (n == 0)
return 0;
return n + Soma(n-1);
}

int main(){
unsigned int n;

printf("Digite o número de elementos: \n");
scanf("%u", &n);

printf("Soma: %u\n", Soma(n));
return 0;
}
[/Code]

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
pmg

O elemento A[n] não existe. No entanto estas a tentar soma-lo na funcao Soma().

Alem disso, o primeiro elemento é o A[0] e nao estas a considerar este elemento na funcao.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
jett

Obrigada pessoal, funcionou aqui. O código ficou:

#include <stdlib.h>
#include <stdio.h>
int Soma(int k, int n, int A[]);
int main()
{
   int n;

   printf("Digite o número de elementos: ");
   scanf("%d", &n);
   int A[n-1];
   int cont = 0;
   while(cont < n)
   {
       A[cont]= cont+1;
       cont ++;
   }
   int s;
   s = Soma(1, n, A);
   printf("Soma: %d\n", s);
   return 0;
}
int Soma(int k, int n, int A[n])
{
   int s;
   if(k > n)
   {
       s = 0;
   }
   else
   {
       s = A[k-1] + Soma(k+1, n, A);
   }
   return s;
}

Edited by pmg
GeSHi

Share this post


Link to post
Share on other sites
pmg

O teu codigo tem erro(s)

   printf("Digite o número de elementos: ");
   scanf("%d", &n);
   int A[n-1];
   int cont = 0;
   while(cont < n)
   {
       A[cont]= cont+1;
       cont ++;
   }

Neste bocadinho de codigo, estas a aceder a um elemento do array que nao existe.

Imagina que se introduz 5 para a variavel n.

Nesse caso cria-se um array com espaco para 4 elementos: os elementos com indices 0, 1, 2, e 3.

Depois, no ciclo while, vais tentar meter o valor 4 em A[4]. Mas A[4] nao existe!!!!

Se conseguires pensar no elemento de indice 0 como o primeiro elemento do array, e evitar aqueles k-1 o teu programa fica mais facil de entender.

So precisas de te habituar a ideia de "indice 0" (que e fundamental para perceber C).


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.