Форум программистов, компьютерный форум CyberForum.ru

Рекурсивно вычислить произведение отрицательных элементов массива - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 5.00
ARTLINE-NN
 Аватар для ARTLINE-NN
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
31.03.2012, 15:36     Рекурсивно вычислить произведение отрицательных элементов массива #1
Написать рекурсивную функцию возвращающую произведение отрицательных элементов массива
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2012, 15:36     Рекурсивно вычислить произведение отрицательных элементов массива
Посмотрите здесь:

C++ Вычислить произведение отрицательных элементов массива
Вычислить произведение отрицательных элементов массива C++
C++ Работа с одномерными массивами (вычислить произведение отрицательных элементов массива.)
Вычислить произведение отрицательных элементов массива C++
C++ Вычислить произведение отрицательных элементов массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DoZZer_
11 / 11 / 1
Регистрация: 09.08.2011
Сообщений: 53
31.03.2012, 16:07     Рекурсивно вычислить произведение отрицательных элементов массива #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream> 
#include <conio.h> 
using namespace std ;
 
/*Рекурсивная функция (массив , номер элемента массива , общее число эл-тов массива , текущий результат рекурсии)*/
int Func(int* mass , int num , int max , int result) ;
 
int main(){
    int massiv[] = {10 , 20 , -10 , -5 , -100 , -2 , 4} ;            //Обрабатываемый массив
    int maxim = sizeof(massiv)/sizeof(int) ;                           //Число элементов в массиве
    cout << Func(massiv , 0 , maxim , 1) ;                             //Запускаем функцию
 
    getch() ;
    return 0 ;
 
}
 
int Func(int* mass , int num , int max , int result){
    if(num < max){                                                       //Если мы не вышли за рамки массива
        if(mass[num] < 0)                                           //Проверяем на равенство нулю
            result *= mass[num] ; 
        num++ ;                                                        //Переходим к следующему элементу
        return Func(mass , num , max , result) ;             //Рекурсивно вызываем функцию
    }
    else
        return result ;                                                //Если вышли за рамки массива, прекращаем расчет
}
ARTLINE-NN
 Аватар для ARTLINE-NN
1 / 1 / 0
Регистрация: 30.03.2012
Сообщений: 82
31.03.2012, 16:28  [ТС]     Рекурсивно вычислить произведение отрицательных элементов массива #3
DoZZer_, спасибо за ответ.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.03.2012, 16:39     Рекурсивно вычислить произведение отрицательных элементов массива #4
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
size_t neg_prod(const int* array, size_t count)
{
    return count ? (*array < 0 ?  *array : 1) * neg_prod(array + 1, count - 1) : 1;
}
 
int main(void)
{
    int array[] = {-5, 8, 9, -1, 15, -3, 0, -2};
    printf("%zd\n", neg_prod(array, sizeof(array) / sizeof(*array)));
    return 0;
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
31.03.2012, 16:46     Рекурсивно вычислить произведение отрицательных элементов массива #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int mul_neg(int *arr, size_t size)
{
   static int fl;
   
   return size ? (*arr < 0 ? (fl = 1), *arr : 1) * mul_neg(arr + 1, size - 1) : fl ? 1 : 0;
} 
 
 
int main(void)
{
   int arr[] = { 1, -2, -3, 4, -5};
   printf("%d\n", mul_neg(arr, sizeof arr / sizeof *arr));
}
http://liveworkspace.org/code/66fa08...adceb1b00f638f

Добавлено через 45 секунд
Nameless One, а если нет отрицательных?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.03.2012, 16:58     Рекурсивно вычислить произведение отрицательных элементов массива #6
Цитата Сообщение от go Посмотреть сообщение
Nameless One, а если нет отрицательных?
как и положено, вернет единицу — нейтральный элемент по умножению. А что, должен быть другой результат?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
31.03.2012, 17:21     Рекурсивно вычислить произведение отрицательных элементов массива #7
Nameless One, А если в массиве два отрицательных элемента (оба минус единица). результат тотже? Вывод: при отсутствии отрицательных элементов, должно вернутся ноль. Это вполне логично.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.03.2012, 17:33     Рекурсивно вычислить произведение отрицательных элементов массива #8
Цитата Сообщение от go Посмотреть сообщение
А если в массиве два отрицательных элемента (оба минус единица). результат тотже?
конечно

Цитата Сообщение от go Посмотреть сообщение
Вывод: при отсутствии отрицательных элементов, должно вернутся ноль. Это вполне логично.
я согласился бы, если бы это бы это было в задании. Но так как про это ничего не сказано, при свертке последовательности должен возвращаться нейтральный элемент. Вот скажи, к примеру, какое число должно возвращаться при суммировании пустой последовательности?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
31.03.2012, 17:45     Рекурсивно вычислить произведение отрицательных элементов массива #9
Nameless One, произведение 0 чисел равно 0.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.03.2012, 17:46     Рекурсивно вычислить произведение отрицательных элементов массива #10
Dani, где такое сказано?
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
31.03.2012, 17:47     Рекурсивно вычислить произведение отрицательных элементов массива #11
Цитата Сообщение от Nameless One Посмотреть сообщение
Dani, где такое сказано?
первый аргумент складывается столько раз, сколько показывает второй
Если аргументов 0, то результат сложения 0 по идее. Мне кажется, что особый случай надо просто отдельно описать и выводить сообщение об этом
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.03.2012, 17:52     Рекурсивно вычислить произведение отрицательных элементов массива #12
Nekto, у нас с Dani вообще-то речь про произведение идет. И да:

Цитата Сообщение от Nekto Посмотреть сообщение
Если аргументов 0, то результат сложения 0 по идее
как ни странно, если аргументов ноль, то ни одной операции сложения вообще не происходит. Но возвращается ноль. А почему? Потому, что ноль — это нейтральный элемент (identity) для операции сложения. И это логично.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
31.03.2012, 17:55     Рекурсивно вычислить произведение отрицательных элементов массива #13
Цитата Сообщение от Nameless One Посмотреть сообщение
Nekto, у нас с Dani вообще-то речь про произведение идет.
"В арифметике под умножением понимают краткую запись суммы одинаковых слагаемых." (с) википедия
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.03.2012, 17:59     Рекурсивно вычислить произведение отрицательных элементов массива #14
Nekto, круто. А теперь скажи, как связано выражение http://www.cyberforum.ru/cgi-bin/latex.cgi?a \cdot 0
с выражением http://www.cyberforum.ru/cgi-bin/latex.cgi?\prod \limits_{i=1}^{n} a_n для http://www.cyberforum.ru/cgi-bin/latex.cgi?i = 0?
Я что-то при нахождении произведения элементов [пустой] последовательности нигде не вижу умножения на ноль. И где мы при этом пользуемся этим правилом:
Цитата Сообщение от Nekto Посмотреть сообщение
первый аргумент складывается столько раз, сколько показывает второй
?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
31.03.2012, 18:04     Рекурсивно вычислить произведение отрицательных элементов массива #15
Цитата Сообщение от Nameless One Посмотреть сообщение
Dani, где такое сказано?
Nameless One, встречно: где сказано, что 1?

Добавлено через 2 минуты
Nekto, хотел сказать, что из начально курса арифметики известно, что a*b = a+a+a... b раз. Следовательно, если a=0, b=2. У 2 детей есть 0 яблок. Всего яблоко 1 чтоли?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
31.03.2012, 18:11     Рекурсивно вычислить произведение отрицательных элементов массива #16
Nameless One, исходя из условия, очевидно, что существует только одно число, которого мы не при каких раскладах не получим - это число 0. (Если в массиве присутствует хотя бы один отрицательный элемент). Из этого следует, что число 0 мы можем использовать для обозначения, какой-нибудь ситуации(ошибочной и т.д.). В данном случае мы используем его, как признак отсутствия отрицательных элементов. Да и по смыслу это подходит.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
31.03.2012, 18:13     Рекурсивно вычислить произведение отрицательных элементов массива #17
ИМХО если элементов нету, то это равносильно умножению пустого множества на пустое множество, что на выходе должно давать пустое множество, а не нейтральный элемент.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
31.03.2012, 18:22     Рекурсивно вычислить произведение отрицательных элементов массива #18
Dani, потому, что единица — это нейтральный элемент по умножению (о чем я уже говорил).

Вот пара примеров. Haskell, считающийся «академичным» языком программирования:

Haskell
1
2
3
4
> product [1,2,3]
6
> product []
1
Octave — (Matlab-совместимый) _математический_ пакет:

Код
[~/samples/c]$ prod([1 2 3])
ans =  6
[~/samples/c]$ prod([])
ans =  1
[~/samples/c]$
Эти примеры говорят сами за себя

Цитата Сообщение от Dani Посмотреть сообщение
Nekto, хотел сказать, что из начально курса арифметики известно, что a*b = a+a+a... b раз. Следовательно, если a=0, b=2. У 2 детей есть 0 яблок. Всего яблоко 1 чтоли?
  1. я прекрасно понял, что он хотел сказать
  2. вот что я не понял, так это то, как связано умножение _на_ ноль с умножением нуля множителей. Может ты объяснишь?
  3. аналогии с яблоками (тем более, что твоя аналогия неправильная, т.к. ты опять путаешь умножение с сложением) нормально работают только для натуральных чисел

Добавлено через 48 секунд
Цитата Сообщение от Nekto Посмотреть сообщение
ИМХО если элементов нету, то это равносильно умножению пустого множества на пустое множество
это твои домыслы. Несогласен — аргументируй. Я свою позицию по этому утверждению изложить могу. И да, что под умножением подразумевается? Декартово произведение?

Добавлено через 4 минуты
Цитата Сообщение от go Посмотреть сообщение
В данном случае мы используем его, как признак отсутствия отрицательных элементов
если это присутствует в задании — Б-га ради. Я говорил про то, что в общем случае таких ситуаций не существует
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
31.03.2012, 18:24     Рекурсивно вычислить произведение отрицательных элементов массива #19
Просто из вопроса логики:
ничто повторенное нисколько раз будет ничто, а не что-то
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2012, 18:25     Рекурсивно вычислить произведение отрицательных элементов массива
Еще ссылки по теме:

C++ Вычислить произведение отрицательных элементов массива
Вычислить произведение отрицательных элементов массива C++
C++ Вычислить произведение первого элемента массива на количества отрицательных элементов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
31.03.2012, 18:25     Рекурсивно вычислить произведение отрицательных элементов массива #20
Цитата Сообщение от Nameless One Посмотреть сообщение
что в общем случаи
Вот тут и оно. Следует решать задачи в общем случае, т.е. использовать признак отсутствия отрицательных элементов. Если сделать оговорку, что в массиве обязательно есть хотя бы 1 отрицательный элемент, тогда да. Но как я уже отметил выше, задачи необходимо решать в общем случае.
Yandex
Объявления
31.03.2012, 18:25     Рекурсивно вычислить произведение отрицательных элементов массива
Закрытая тема Создать тему
Опции темы

Текущее время: 21:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru