Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nbalexey
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 9
#1

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

21.12.2013, 07:29. Просмотров 373. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 07:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните пожалуйста. Нюансы программы с рекурсией (C++):

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

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

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

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

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

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

14
Amandosov
Знаток
156 / 156 / 65
Регистрация: 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
nbalexey
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 9
21.12.2013, 09:10  [ТС] #3
спасибо. а объяснение всей программы можно?

Добавлено через 46 минут
http://forum.ixbt.com/topic.cgi?id=40:737
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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
0x10
2505 / 1683 / 253
Регистрация: 24.11.2012
Сообщений: 4,211
21.12.2013, 11:06 #5
Цитата Сообщение от outoftime Посмотреть сообщение
Перепишите рекурсию вот так:
И вылететь за границы массива?
0
nbalexey
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 9
21.12.2013, 11:17  [ТС] #6
спасибо. а если указатели убрать и без них сделать, как получится?
0
0x10
2505 / 1683 / 253
Регистрация: 24.11.2012
Сообщений: 4,211
21.12.2013, 11:21 #7
Цитата Сообщение от nbalexey Посмотреть сообщение
а если указатели убрать и без них сделать, как получится?
Откуда и куда убрать? Имя массива есть указатель.
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.12.2013, 11:37 #8
Цитата Сообщение от 0x10 Посмотреть сообщение
И вылететь за границы массива?
Откуда вы это взяли?
0
0x10
2505 / 1683 / 253
Регистрация: 24.11.2012
Сообщений: 4,211
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
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.12.2013, 11:50 #10
0x10, Кто сказал что в массиве n элементов если мы обращаемся по индексу n?
0
0x10
2505 / 1683 / 253
Регистрация: 24.11.2012
Сообщений: 4,211
21.12.2013, 11:52 #11
Цитата Сообщение от outoftime Посмотреть сообщение
Кто сказал что в массиве n элементов если мы обращаемся по индексу n?
При такой сигнатуре функции самое ожидаемое назначение аргумента n - размерность массива. Если же от программиста требуется передать не количество элементов, а индекс последнего, то у функции неинтуитивный интерфейс.
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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
0x10
2505 / 1683 / 253
Регистрация: 24.11.2012
Сообщений: 4,211
21.12.2013, 12:08 #13
С точки входа и надо было начинать.
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.12.2013, 12:17 #14
0x10, у ТС нету точки входа и это не проблема.
0
0x10
21.12.2013, 12:21     Объясните пожалуйста. Нюансы программы с рекурсией
  #15

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2013, 12:21
Привет! Вот еще темы с ответами:

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

Нюансы обучения: желание учесть все нюансы - корректность кода или overengineering? - C++
Здравствуйте программисты! Ответьте пожалуйста на такой вопрос(объясните) Вот я учу С++ и решаю задачи по учебникам, и постоянно...

Объясните пожалуйста - C++
Есть код : char text=&quot;In&quot;; int a=sizeof(text); Вопрос : почему a = 3 ? ( там 2 символа вроде как )

Объясните пожалуйста - C++
Как работает эта программа? #include &lt;iostream&gt; using namespace std; int main() { char mas1;


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.