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

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

Восстановить пароль Регистрация
 
andre2012
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 02:02     Не получается с рекурсией #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
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);
    }   
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 02:02     Не получается с рекурсией
Посмотрите здесь:

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

Добавлено через 7 минут
Цитирую Стивена Прата: "Каждое значение сохраняется в отдельном элементе массива, и компьютер сохраняет все элементы массива в памяти ПОСЛЕДОВАТЕЛЬНО - друг за другом". Указатель передвигается по смежным адресам этого массива, так опять-таки, почему нельзя сравнить между собой эти адреса посредством указателя?
Peregrin
33 / 33 / 1
Регистрация: 16.11.2012
Сообщений: 59
16.11.2012, 10:56     Не получается с рекурсией #9
Да, был не прав, прочел тоже на сайте Microsoft.
A &ptr[7] у нас определен вообще? Ведь у нас 7 элементов, значит &ptr[6] последний, логичнее поставить <= &ptr[6].
andre2012
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 11:07  [ТС]     Не получается с рекурсией #10
Пробовал, но все тоже.
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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 всегда
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2012, 11:33     Не получается с рекурсией
Еще ссылки по теме:

Помогите с рекурсией C++
C++ Бинарное с рекурсией
C++ выручите с рекурсией

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

Или воспользуйтесь поиском по форуму:
andre2012
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 11:33  [ТС]     Не получается с рекурсией #12
Спасибо, понял. Я думал, что написав &ptr[7], ptr в этом выражении не будет смещаться на 1, а будет смещаться только ptr. Но конечно же, (ptr + 7) и &ptr[7] абсолютно эквивалентны.
Yandex
Объявления
16.11.2012, 11:33     Не получается с рекурсией
Ответ Создать тему
Опции темы

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