Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.11.2012, 02:02
Ответы с готовыми решениями:

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

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

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

Функция с рекурсией
Написать функцию с использованием рекурсии, которая увеличивает все элементы числового списка в два...

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

Добавлено через 7 минут
Цитирую Стивена Прата: "Каждое значение сохраняется в отдельном элементе массива, и компьютер сохраняет все элементы массива в памяти ПОСЛЕДОВАТЕЛЬНО - друг за другом". Указатель передвигается по смежным адресам этого массива, так опять-таки, почему нельзя сравнить между собой эти адреса посредством указателя?
0
33 / 33 / 5
Регистрация: 16.11.2012
Сообщений: 59
16.11.2012, 10:56 9
Да, был не прав, прочел тоже на сайте Microsoft.
A &ptr[7] у нас определен вообще? Ведь у нас 7 элементов, значит &ptr[6] последний, логичнее поставить <= &ptr[6].
0
0 / 0 / 0
Регистрация: 16.11.2012
Сообщений: 6
16.11.2012, 11:07  [ТС] 10
Пробовал, но все тоже.
0
Модератор
Эксперт по электронике
8950 / 6716 / 921
Регистрация: 14.02.2011
Сообщений: 23,701
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
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2012, 11:33
Помогаю со студенческими работами здесь

Сложность с рекурсией
Нужно написать программу, которая будет вычислять каждый член ряда по формуле, а также их сумму, на...

Програма с рекурсией
Помогите,мне надо описать рекурсивную функцию,которая для заданого ε&gt;0 обсчитывала б границу...

Задача с рекурсией!
Задание 1. Опишите мир задачи и составьте рекурсивное правило. Варианты заданий....

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru