0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 9
1

Объясните пожалуйста. Нюансы программы с рекурсией

21.12.2013, 07:29. Показов 559. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Просьба, объясните пару нюансов программы. всё работает, но не могу разобраться для чего нам нужны вот эти строки, и что они делают? Задание: С помощью рекурсивной функции вычислить сумму элементов одномерного массива.
C++
1
2
3
4
int sum(int *a, int n)
{
 if (n==1) return a[0];
 else return a[n-1]+sum(&a[0],n-1);
Вот сама программа!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <locale.h>
#include <conio.h>
#include <stdlib.h>
#define kol 6
 
int sum(int *a, int n)
{
 if (n==1) return a[0];
 else return a[n-1]+sum(&a[0],n-1);
}
 
void main()
{
 int x[kol],summa;
 clrscr();
 randomize();
 for(int i=0;i<kol;i++)
 printf("%d",x[i]=rand()%10);
 summa=sum(&x[0],kol);
 printf("\n : %d ",summa);
 getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2013, 07:29
Ответы с готовыми решениями:

Объясните, пожалуйста, действия программы
#include &lt;stdio.h&gt; #include&lt;string&gt; #include&lt;map&gt; #include &lt;stdlib.h&gt; #include&lt;iostream&gt; using...

Объясните пожалуйста ход работы программы
Дан код #include&lt;iostream&gt; #include&lt;windows.h&gt; using namespace std; HANDLE console =...

Объясните пожалуйста результат работы программы
#include &lt;iostream&gt; using namespace std; int main() { short int i; short unsigned...

Объясните пожалуйста код и ход работы программы на С++
Вот код фрагмента программы: int i; int l=strlen(str); int k=strlen(fsubstr); ...

14
Знаток
156 / 156 / 185
Регистрация: 18.11.2012
Сообщений: 411
Записей в блоге: 2
21.12.2013, 07:44 2
Считает сумму с конца
C++
1
2
3
4
5
int sum(int *a, int n)
{
*if (n==1) return a[0];/* если n==1, то есть если первый элемент, тогда заканчивается рекурсия и возвращает последнюю оставшуюся элемент*/
*else return a[n-1]+sum(&a[0],n-1);./* а в других случаях, возвращает сумму элемента(a[n-1]) и рекурсию для этого элемента*/
}
1
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 9
21.12.2013, 09:10  [ТС] 3
спасибо. а объяснение всей программы можно?

Добавлено через 46 минут
http://forum.ixbt.com/topic.cgi?id=40:737
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.12.2013, 10:23 4
Перепишите рекурсию вот так:
C++
1
2
3
int sum(const int a[], int n) {
    return n < 0 ? 0 : a[n] + sum(a, n - 1);
}
Добавлено через 2 минуты
Цитата Сообщение от nbalexey Посмотреть сообщение
#define kol 6
Для этого существуют константы.
1
3255 / 2057 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
21.12.2013, 11:06 5
Цитата Сообщение от outoftime Посмотреть сообщение
Перепишите рекурсию вот так:
И вылететь за границы массива?
0
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 9
21.12.2013, 11:17  [ТС] 6
спасибо. а если указатели убрать и без них сделать, как получится?
0
3255 / 2057 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
21.12.2013, 11:21 7
Цитата Сообщение от nbalexey Посмотреть сообщение
а если указатели убрать и без них сделать, как получится?
Откуда и куда убрать? Имя массива есть указатель.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.12.2013, 11:37 8
Цитата Сообщение от 0x10 Посмотреть сообщение
И вылететь за границы массива?
Откуда вы это взяли?
0
3255 / 2057 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
21.12.2013, 11:44 9
Цитата Сообщение от outoftime Посмотреть сообщение
int sum(const int a[], int n) {
* * return n < 0 ? 0 : a[n] + sum(a, n - 1);
}
В массиве из n элементов обращение к a[n].
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.12.2013, 11:50 10
0x10, Кто сказал что в массиве n элементов если мы обращаемся по индексу n?
0
3255 / 2057 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
21.12.2013, 11:52 11
Цитата Сообщение от outoftime Посмотреть сообщение
Кто сказал что в массиве n элементов если мы обращаемся по индексу n?
При такой сигнатуре функции самое ожидаемое назначение аргумента n - размерность массива. Если же от программиста требуется передать не количество элементов, а индекс последнего, то у функции неинтуитивный интерфейс.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.12.2013, 12:06 12
0x10, Уважаемый, это рекурсия.

Добавлено через 1 минуту
C++
1
2
template<size_t N>
int sum(const int a[N]) { return sum(a, N - 1); }
Вот вам точка входа если хотите.
0
3255 / 2057 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
21.12.2013, 12:08 13
С точки входа и надо было начинать.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
21.12.2013, 12:17 14
0x10, у ТС нету точки входа и это не проблема.
0
0x10
21.12.2013, 12:21     Объясните пожалуйста. Нюансы программы с рекурсией
  #15

Не по теме:

В любом случае смысл разделения одной функции на две от меня ускользает.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.12.2013, 12:21

Ребята, объясните пожалуйста каждую строку этой программы
#include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; int main(); const int*...

Объясните,пожалуйста,что происходит в этом куске программы?
Требуется динамическое выделение памяти под двухмерный массив с заполнением массива с клавиатуры. ...

Объясните пожалуйста как работают эти программы, если можно с комментариями к коду
Объясните пожалуйста как работают эти программы, если можно с комментариями к коду #include...

Программа которая выводит два наибольших числа из десяти введенных. Пожалуйста объясните суть работы программы
#include &lt;iostream&gt; using namespace std; int main() { int i; float number,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru