Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зделать рекурсию 
V
    Опции темы
Zorak
Дата 3.11.2008, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 720
Регистрация: 13.11.2007

Репутация: нет
Всего: 3



Вот написал код для нахождения НСД двух целих чисел)
[code=#C]
#include "stdio.h";

int NSD(int a, int b)
{
int i,min;
int buf = 0;
    
    if (a < b)
        { 
            min = a;
        } else 
            { 
                min = b ;
            }

    for(i = 1; i<=min; i++)
    {
        if ((a % i == 0) && (b % i == 0))  
        {
            buf = i;
        }
    }
    return buf;
}

void main()
{
    
    int a,b,value = 0;
    
    printf("A= ");
    scanf("%d",&a);
    printf("B= ");
    scanf("%d",&b);

    value = NSD(a,b);
    printf("Zna4: %d\n",value);

}
[/code]

Как мне из етой функции сделать рекурсивную функцию ???


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
Acer
Дата 3.11.2008, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



А зачем делать из нее рекурсивную функцию?
PM MAIL   Вверх
mes
Дата 3.11.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



вроде так:
Код

int NSD_impl (int i, int a, int b)
{
   if ((a % i == 0) && (b % i == 0))  return i;
//   if (i>a || i>b)  return 0;
   return NSD_impl (++i, a, b );
}

int NSD(int a, int b)
{
    return NSD_impl(1, a, b);
}

только у данного исполнения есть недостсток : если не найдет подходящее значениее, то рекурсия зациклется,
как вариант можно раскомментировать строку проверки условия значения (больше чем одно из исходных данных).


P.S. пользуйтесь, пожалуйста, кнопкой код,  для оформления поста.

Это сообщение отредактировал(а) mes - 3.11.2008, 20:51


--------------------
PM MAIL WWW   Вверх
Zorak
Дата 3.11.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 720
Регистрация: 13.11.2007

Репутация: нет
Всего: 3



Цитата(mes @ 3.11.2008,  20:43)
вроде так:
Код

int NSD_impl (int i, int a, int b)
{
   if ((a % i == 0) && (b % i == 0))  return i;
   return NSD_impl (++i, a, b );
}

int NSD(int a, int b)
{
    return NSD_impl(1, a, b);
}

только у данного исполнения есть недостсток : если не найдет подходящее значениее, то рекурсия зациклется. 


P.S. пользуйтесь, пожалуйста, кнопкой код,  для оформления поста.

Ок, буду пользоваться) спасибо =)

Добавлено через 28 секунд
Цитата(Acer @ 3.11.2008,  20:37)
А зачем делать из нее рекурсивную функцию?

Задача такая стоит )


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
Zorak
Дата 3.11.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 720
Регистрация: 13.11.2007

Репутация: нет
Всего: 3



Цитата(mes @ 3.11.2008,  20:43)
только у данного исполнения есть недостсток : если не найдет подходящее значениее, то рекурсия зациклется,
как вариант можно раскомментировать строку проверки условия значения (больше чем одно из исходных данных).

баг етого кода состоит в том, что как результат передаеться число 1 вданном случае.. тоесть то число, которое передаеться у функцию  NSD_impl(1, a, b);
при условии, что оба числа на него деляться... как по мне ето через return i, ибо условие исполняеться, возвращаеться наше i и виходит на результат(


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
mes
Дата 3.11.2008, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Zorak @  3.11.2008,  21:05 Найти цитируемый пост)
ибо условие исполняеться, возвращаеться наше i

дествительно (

а как он должен себя вести то ?

NSD -это наибольший общий делитель ? шас подумаю


Это сообщение отредактировал(а) mes - 3.11.2008, 21:14


--------------------
PM MAIL WWW   Вверх
Zorak
Дата 3.11.2008, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 720
Регистрация: 13.11.2007

Репутация: нет
Всего: 3



я переписал вот так
Код

int NSD_impl (int i, int a, int b)
{
    int buf;
    if ((a % i == 0) && (b % i == 0))  
    {
        buf = i; 
    }
       if (i == a || i == b) break;
   
   return NSD_impl (i++, a, b );
}

int NSD(int a, int b)
{
   return NSD_impl(1, a, b);
}

но материться по поводу Break, мло типа иилегал( : error C2043: illegal break ...что ето значит и как ето виправить ?))

Добавлено через 40 секунд
Цитата(mes @ 3.11.2008,  21:13)
Цитата(Zorak @  3.11.2008,  21:05 Найти цитируемый пост)
ибо условие исполняеться, возвращаеться наше i

дествительно (

а как он должен себя вести то ?

NSD -это наименьший общий делитель ?

мм ето найбільший спільний дільник =) не знаю как по русски будит)


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
mes
Дата 3.11.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



проверяйте :

Код


int NSD_impl (int i, int a, int b)
{
     if ((a % i == 0) && (b % i == 0))  return i;
     return NSD_impl (--i, a, b );

// эту функцию можно записать короче :
// return  ((a % i == 0) && (b % i == 0)) ? i :  NSD_impl (--i, a, b );
}
int NSD(int a, int b)
{
    return NSD_impl(std::min(abs(a),abs(b)), a, b);
}



Это сообщение отредактировал(а) mes - 3.11.2008, 21:25


--------------------
PM MAIL WWW   Вверх
Zorak
Дата 3.11.2008, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 720
Регистрация: 13.11.2007

Репутация: нет
Всего: 3



Цитата(mes @ 3.11.2008,  21:19)
проверяйте :

материться по поводу std::min, не видит то ли класа, толи самого метода.. хз: std' : is not a class or namespace name

В принципе если логически подумать, то ето тоже не должно нормально работать, так как береться минимальний елемнт и двигаеться к одинице... и в результате опять будит 1)

Это сообщение отредактировал(а) Zorak - 3.11.2008, 21:27


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
mes
Дата 3.11.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Zorak @  3.11.2008,  21:25 Найти цитируемый пост)
материться по поводу std::min,

если пишете для C++, то добавьте #include <iostream>
если под Си то (не знаю есть ли готовая) легче подставить свою реализацию

Добавлено через 3 минуты и 43 секунды
Цитата(Zorak @  3.11.2008,  21:25 Найти цитируемый пост)

В принципе если логически подумать, то ето тоже не должно нормально работать, так как береться минимальний елемнт и двигаеться к одинице... и в результате опять будит 1)

неа, не так.
 берется в рекурсии декремент (вторая строчка функции NSD_impl) от минимального из двух исходных чисел, но как только встретиться число удовлетворяющее требованию(первая строчка функции  NSD_impl), то рекурсия закончится(начнет разворачиваться).



--------------------
PM MAIL WWW   Вверх
Zorak
Дата 3.11.2008, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 720
Регистрация: 13.11.2007

Репутация: нет
Всего: 3



Цитата(mes @ 3.11.2008,  21:37)
 берется в рекурсии декремент (вторая строчка функции NSD_impl) от минимального из двух исходных чисел, но как только встретиться число удовлетворяющее требованию(первая строчка функции  NSD_impl), то рекурсия закончится(начнет разворачиваться).

Диствительно.. моя ошибка в мислях =)... всё работает... вставил только "свою реализацию" алгоритма нахождения минимального числа)... в целом программа виглядит вот так: (может кому понадобиться)
Код


#include "stdio.h";
#include "iostream.h";

int NSD_impl (int i, int a, int b)
{
 return  ((a % i == 0) && (b % i == 0)) ? i :  NSD_impl (--i, a, b );
}

int NSDd(int a, int b)
{
int min;
    if (a < b)
        { 
            min = a;
        } else 
            { 
                min = b ;
            }
    return NSD_impl(min, a, b);
}


void main()
{
    
    int a,b,value = 0;
    
    printf("A= ");
    scanf("%d",&a);
    printf("B= ");
    scanf("%d",&b);

    value = NSDd(a,b);
    printf("Zna4: %d\n",value);

}


З.Ы. Спасибо большое =)

Это сообщение отредактировал(а) Zorak - 3.11.2008, 21:49


--------------------
Знание - сила. А сила есть, ума не надо...
Занимаюсь интернет бизнесом и ищу новых партнеров. Кому интересно - обращайтесь в ЛС, скайп или мыло.
PM MAIL ICQ   Вверх
J0ker
Дата 3.11.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Код

unsigned GCD(int a, int b)
{
    a = abs(a);
    b = abs(b);
    unsigned x = min(a, b);
    unsigned y = max(a, b) % x;
    return y?GCD(x, y):x;
}


Добавлено @ 22:04
перебор не самый эффективный метод

Это сообщение отредактировал(а) J0ker - 3.11.2008, 22:08


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 3.11.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Zorak @  3.11.2008,  21:48 Найти цитируемый пост)
. вставил только "свою реализацию" алгоритма нахождения минимального числа)..

можно написать так :
Код

int NSD(int a, int b)
{
    return NSD_impl((a<b)?a:b, a, b);
}

еше нужно бы решить вопрос с нулем и отрицательными числами на входе..

Добавлено через 5 минут и 56 секунд
Цитата(J0ker @  3.11.2008,  22:03 Найти цитируемый пост)
    unsigned y = max(a, b) % x;
    return y?GCD(x, y):x

хороший алгоритмочек   smile 




--------------------
PM MAIL WWW   Вверх
J0ker
Дата 3.11.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



алгоритм Эвклида если кому интересно


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0582 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.