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

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

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

Не получается с рекурсией - C++

16.11.2012, 02:02. Просмотров 509. Ответов 11
Метки нет (Все метки)

У меня получается бесконечный вызов рекурсивной функции. Может кто подскажет, где кроется ошибка?

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
#include<iostream>
using namespace std;
 
void func(int *ar, int &);
 
int main()
{   
    int sum = 0;
    int ar[7] = {1, 2, 3, 4, 5, 6, 7};  
    int *pt = ar;
    func(pt, sum);  
    cout << sum << endl;
    return 0;
}
 
 
void func(int *ptr, int &sum)
{   
    if(ptr < &ptr[7])
    {
        sum += *ptr;
    func(ptr + 1, sum);
    }   
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 02:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не получается с рекурсией (C++):

Не получается решить задание на рекурсией! - C++
Не получается решить задачу((( Помогите решить на С

с++ с рекурсией - C++
помогите плиз разобраться с рекурсией.завал по лабораторным В данной последовательности чисел найти подпоследовательность подряд...

Помогите с Рекурсией ! - C++
Даны первый член и разность арифметической прогрессии. Написать рекурсивную функцию для нахождении n-ого члена прогрессии и сумму всех...

Задача с рекурсией! - C++
Вычислите значение функции для некоторого n (n – количество рекурсивных вызовов) Работа в Turbo C обязательна

программа с рекурсией - C++
#include &lt;iostream.h&gt; #include &lt;math.h&gt; double rekyrsia(int ,int ,int ); int x=2; int main() { int a,n,i=0; cout&lt;&lt;&quot;...

Бинарное с рекурсией - C++
Вот две задачи, помогите пожалуйста. Неделю уже долблю

11
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
16.11.2012, 03:26 #2
По-моему,
C++
1
if(ptr < &ptr[7])
делать нельзя. Ты сравниваешь указатели! Такого делать нельзя.
0
alkagolik
Заблокирован
16.11.2012, 04:00 #3
Цитата Сообщение от andre2012 Посмотреть сообщение
if(ptr < &ptr[7])
это бесит. могу и "в морду дать"
0
andre2012
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 09:52  [ТС] #4
А почему нельзя сравнить адреса указателей одного и того же массива? Находится ли определенный элемент левее искомого? Поясните, почему так нельзя сравнивать.
0
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
16.11.2012, 09:58 #5
Цитата Сообщение от andre2012 Посмотреть сообщение
Находится ли определенный элемент левее искомого?
Не факт. Твои элементы могут быть раскиданы по памяти как хотят. Можешь для интереса повыводить ptr.
0
andre2012
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 10:20  [ТС] #6
Согласен. Но ведь сравниваю адреса ни каких-то абстрактных указателей, а адреса памяти конкретного массива, элементы которого расположены в смежных ячейках памяти. И прибавляя 1 к указателю, я переставляю его на адрес следующей ячейки памяти массива. Ведь я присвоил указателю конкретный адрес нулевого индекса массива.
0
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
16.11.2012, 10:30 #7
Цитата Сообщение от andre2012 Посмотреть сообщение
адреса памяти конкретного массива, элементы которого расположены в смежных ячейках памяти
Тоже не факт. Зависит от компилятора. И ptr+1 - это просто команда перейти на следующий элемент.
0
andre2012
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 10:38  [ТС] #8
Цитата Сообщение от alkagolik Посмотреть сообщение
это бесит. могу и "в морду дать"
А почему бесит, так и не объяснил.

Добавлено через 7 минут
Цитирую Стивена Прата: "Каждое значение сохраняется в отдельном элементе массива, и компьютер сохраняет все элементы массива в памяти ПОСЛЕДОВАТЕЛЬНО - друг за другом". Указатель передвигается по смежным адресам этого массива, так опять-таки, почему нельзя сравнить между собой эти адреса посредством указателя?
0
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
16.11.2012, 10:56 #9
Да, был не прав, прочел тоже на сайте Microsoft.
A &ptr[7] у нас определен вообще? Ведь у нас 7 элементов, значит &ptr[6] последний, логичнее поставить <= &ptr[6].
0
andre2012
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 11:07  [ТС] #10
Пробовал, но все тоже.
0
ValeryS
Модератор
6676 / 5085 / 475
Регистрация: 14.02.2011
Сообщений: 17,058
16.11.2012, 11:19 #11
Цитата Сообщение от andre2012 Посмотреть сообщение
"Каждое значение сохраняется в отдельном элементе массива, и компьютер сохраняет все элементы массива в памяти ПОСЛЕДОВАТЕЛЬНО - друг за другом". Указатель передвигается по смежным адресам этого массива, так опять-таки, почему нельзя сравнить между собой эти адреса посредством указателя?
ключевое значение ЭТОГО
когда у тебя будет ptr == &ptr[6]
куда будет указывать ptr + 1?
мы уже на краю массива и добавление 1 чревато
но не это главное главное

а вот это
Цитата Сообщение от andre2012 Посмотреть сообщение
ptr < &ptr[7]
это будет всегда исполнятся
перепишем чтобы стало понятней
ptr < (ptr+7)
сократим на ptr
1<7 всегда

ты каждый раз передаешь в функцию новый адрес
и сравниваешь этот новый адрес со смешением 7 относительно нового адреса

Добавлено через 3 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
сократим на ptr
1<7 всегда
извини, коряво написал (с точки зрения математики)но смысл не теряется
правильно написать так вычитаем ptr(упрощаем)
0<7 всегда
2
andre2012
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 11:33  [ТС] #12
Спасибо, понял. Я думал, что написав &ptr[7], ptr в этом выражении не будет смещаться на 1, а будет смещаться только ptr. Но конечно же, (ptr + 7) и &ptr[7] абсолютно эквивалентны.
0
16.11.2012, 11:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 11:33
Привет! Вот еще темы с ответами:

выручите с рекурсией - C++
Как зделать рекурсию? #include&lt;stdio.h&gt;

Программа с рекурсией - C++
Может не совсем по адресу. Но есть у меня одна проблема. Никак не могу сделать эту лабу. Может кто помочь? В общем нужно следующее....

Задача с рекурсией! - C++
Задача на английском языке... Write a recursive function that take as arguments an array of char a,a character c and the length of the...

Помогите с рекурсией - C++
Надо написать рекурс.функцию, возвращающую введенное пользователем число в обратном порядке


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

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

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