Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2013, 15:18   #11
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Цитата:
Изрядная часть рекурсивных построений следует довольно простой схеме:
1) Сказать: "пусть у нас есть требуемая нам функция" (пусть S(a,b) - функция суммы чисел от a до b).
2) Найти какие-то условия, при которых значение функции уже известно (если b<a, то S(a,b)=0).
3) Придумать, увидеть инвариант - некое соотношение между функцией и её аргументами (если a<=b, то S(a,b) = a+S(a+1,b)). Желательно выстроить такую функцию, что по обе стороны равенства инварианта находятся только значения функции при разных аргументах (R(a,b,c) такова, что R(a,b,0)=S(a,b), при b<a R(a,b,c)=c, при a<=b R(a,b,c)=R(a+1,b,a+c)).
4) Воплотить в коде. Функция R - это по сути Ваш цикл, R(i,b,sum)=R(i+1,b,sum+i) - итерация цикла; начали с R(a,b,0), обратите внимание.
Если это не сарказм, то Вам в учителя, срочно.


Код:
#include <stdio.h>

const int from = 1;
const int to = 10;

int sum_between(int from, int to)
{
	return (to == from+1) ? (from+to) : (to + sum_between(from,to-1)); 
}

int main()
{
	printf("sum between:%d" , (from == to) ? (from) : (sum_between(from,to)) );
	return 0;
}

Последний раз редактировалось tools; 21.05.2013 в 15:21.
tools вне форума Ответить с цитированием
Старый 21.05.2013, 15:38   #12
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Если это не сарказм, то Вам в учителя, срочно.
Не уверен, что правильно понял эту фразу.

На самом деле, рекурсия в C++ - редкий гость. В задачах вроде приведённой итеративное решение однозначно лучше, и даже формально написанное рекурсивное вряд ли даст толкового понимания того, что такое рекурсия и с чем её едят. Сравните:
Код:
int sum_between_acc(int from, int to, int acc){
  return (from>to)?acc:sum_between_acc(from+1, to, acc+from);
}

int sum_between(int from, int to){
  return sum_between_acc(from, to, 0);
}
Существенный момент - что компилятору оставлена возможность вместо рекурсивного вызова sum_between_acc просто перейти в начало функции, изменив значения аргументов (т.н. "хвостовая рекурсия"). Не то чтобы большинство компиляторов C++ этой возможностью пользовались, насколько помню...
Abstraction вне форума Ответить с цитированием
Старый 21.05.2013, 15:51   #13
mixon-21
Я только Учусь
Форумчанин
 
Аватар для mixon-21
 
Регистрация: 06.03.2013
Сообщений: 193
По умолчанию

Цитата:
Сообщение от tools Посмотреть сообщение
Если это не сарказм, то Вам в учителя, срочно.


Код:
#include <stdio.h>

const int from = 1;
const int to = 10;

int sum_between(int from, int to)
{
	return (to == from+1) ? (from+to) : (to + sum_between(from,to-1)); 
}

int main()
{
	printf("sum between:%d" , (from == to) ? (from) : (sum_between(from,to)) );
	return 0;
}
А зачем ответ писать????????????????
mixon-21 вне форума Ответить с цитированием
Старый 21.05.2013, 17:54   #14
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию

Цитата:
Сообщение от mixon-21 Посмотреть сообщение
Правильно??????????????????????
Рекомендую ознакомиться с правилами форума.
hon вне форума Ответить с цитированием
Старый 21.05.2013, 18:51   #15
mixon-21
Я только Учусь
Форумчанин
 
Аватар для mixon-21
 
Регистрация: 06.03.2013
Сообщений: 193
По умолчанию

Код:
#include<iostream>

using namespace std;
int sum(int a,int b){
	int N;
	/*cin>>a>>b;*/
if(N<=a||a==0){
	N!=a+(b-1);
	cout<<N;
}
else
   if(a!=a)
	   sum(a,b);


cout<<N;
return 1;
}
	
void main(){

	sum(1,3);

}
где-то нада что-то дописать подскажите плиз
mixon-21 вне форума Ответить с цитированием
Старый 21.05.2013, 19:01   #16
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Цитата:
где-то нада что-то дописать
где-то надо что-то убрать

это,что за вензеля:

Код:
if(N<=a||a==0){
	N!=a+(b-1);
	cout<<N;
}
и

Код:
if(a!=a)
	   sum(a,b);
P.S. Не мучайтесь, посмотрите мой вариант, разберитесь с ним, а потом решите другой примерчик на рекурсию без дополнительных вопросов на форуме.
tools вне форума Ответить с цитированием
Старый 21.05.2013, 20:22   #17
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
где-то нада что-то дописать подскажите плиз
Попробую объяснить чуть иначе. Рекурсивное решение задачи (и вообще рекурсивное исчисление) - это, в некотором роде, способ раз за разом переформулировать условие задачи, пока решение не станет очевидным. То есть, мы пишем функцию sum(int a, int b) и рекурсивно вызываем sum(a', b'), которую почему-либо посчитать легче. Например, отталкиваясь от того, что sum(a+1, b) посчитать легче, чем sum(a, b).

А что у Вас? А у Вас sum(a,b) вызывает sum(a,b), и получается дурная бесконечность, она же зацикливание.

Напишите сначала математическое решение. На язык программирования его можно переложить потом, главное - понимать, какой объект Вы строите.
Abstraction вне форума Ответить с цитированием
Старый 21.05.2013, 20:48   #18
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

предложу свой вариант на псевдокоде
Код:
функция рек(первое_число, второе_число) // первое число больше второго
{
  если первое_число == второе_число тогда
    рек возвращает второе_число
  иначе 
    рек возвращает первое_число + рек(первое_число - 1, второе_число);
}
написать на сишном вам оставлю...
первое и второе число и есть ваш диапазон
p.s. сори... не приметил второй страницы темы...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 24.05.2013, 13:03   #19
mixon-21
Я только Учусь
Форумчанин
 
Аватар для mixon-21
 
Регистрация: 06.03.2013
Сообщений: 193
По умолчанию

спасибо!!!!!!!!!!!!!!!!!!
mixon-21 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсии fre Паскаль, Turbo Pascal, PascalABC.NET 2 03.04.2012 09:59
Организация рекурсии Rekky Общие вопросы C/C++ 6 24.08.2011 17:22
Задача по рекурсии Болванка Паскаль, Turbo Pascal, PascalABC.NET 1 21.12.2010 16:01
Рекурсии RAMA Паскаль, Turbo Pascal, PascalABC.NET 6 18.10.2009 13:56
Рекурсии Logan Паскаль, Turbo Pascal, PascalABC.NET 1 13.05.2008 08:52