2013-11-18 4 views
0

Все,Рекурсивные функции в C++

Я пишу рекурсивную функцию, чтобы сделать следующее:

//addbig() -- This function is sent an array of integers and the length of the array. 
//It returns the sum of all integers in the array that are larger than 1000. 

Как-то моя функция не работает. Это дает мне нулевой результат.

long addbig (const int arrInt[],int l) 
{ 
     if (l == 0) 
      return 0; 
    else if(arrInt[l]>1000) 
     return arrInt[l] + addbig (arrInt,l-1); 
    else 
     return addbig (arrInt,l-1); 
} 

Мой целочисленный массив:

int arrInt[10]={1000,1,1000,2,1000,3,1000,4,1000,5}; 

Может кто-нибудь пролить некоторый свет на то, почему это не работает, и помочь мне немного. haha no pun предназначенный

+8

ни один из номеров в вашем массиве не больше, чем 1000. – Daboyzuk

+0

@Daboyzuk является абсолютно правильным. 1000 равно 1000, не более. Try 1001;) –

+1

Кроме того, похоже, что вы используете 'l' как индекс элемента, который вы пытаетесь просмотреть, так и количество оставшихся элементов. Поскольку код написан, вы никогда не будете смотреть на 'arrInt [0]' – bengoesboom

ответ

0

Ваш базовый чехол неправильный. Я установил его ниже. Примечание: ни один из чисел в arrInt не превышает 1000, поэтому вы всегда будете получать нулевой результат.

long addbig (const int arrInt[],int l) 
{ 
     if (l <= 0) 
      return 0; 
    else if(arrInt[l-1]>1000) 
     return arrInt[l-1] + addbig (arrInt,l-1); 
    else 
     return addbig (arrInt,l-1); 
} 
+3

Это все равно вызовет UB при первом вызове. –

+2

Это не должно быть принятым ответом, как написано. Условие 'else if (arrInt [l]> 1000) будет вызывать UB. –

+1

Я решил проблему UB. – RouteMapper

4

Во-первых, ни один из номеров в тестовом массиве не больше, чем 1000. Таким образом, вы получите 0.

Во-вторых, вы вызывающую UB:

long addbig (const int arrInt[],int l) 
{ 
    if (l == 0) 
     return 0; 
    else if(arrInt[l] > 1000) // PROBLEM! 
     return arrInt[l] + addbig (arrInt,l-1); 
    else 
     return addbig (arrInt,l-1); 
} 

Если l это ваш длина массива, при первом вызове этой функции будет доступ к 1 элементу за пределами массива. То, что я думаю, что вы хотите:

long addbig (const int arrInt[],int l) 
{ 
    if (l == 0) 
     return 0; 
    return addbig(arrInt, l - 1) + (arrInt[l - 1] > 1000 ? arrInt[l - 1] : 0); 
} 
0
long addbig(const int a[], size_t n) 
{ 
    const int LIMIT = 1000; 
    return (n == 0 ? 0 : a[0] > LIMIT + addbig(a + 1, n - 1)); 
} 
+0

Это просто подсчет количества элементов, превышающих предел, а не вычисляет их сумму. –

+0

@ Zac Howland, вы правы. Я не читал сообщение внимательно. :) –

0

Это может помочь вам: D

#include <iostream> 

using namespace std; 

long addbig(const int arrInt[], int l) 
{ 
    if (l == 0) 
     return 0; 
    else if (arrInt[l - 1] > 1000) 
     return arrInt[l - 1] + addbig(arrInt, l - 1); 
    else 
     return addbig(arrInt, l - 1); 
} 

int main() 
{ 
    int arrInt[10] = {1001, 1, 2000, 2, 1000, 3, 1000, 4, 1000, 5}; 

    cout << addbig(arrInt, 10) << endl; 

    return 0; 
} 
Смежные вопросы