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

Рекурсия - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
NeroAngelo
0 / 0 / 0
Регистрация: 21.03.2010
Сообщений: 8
09.10.2010, 22:08     Рекурсия #1
Помогите пожалуйста составить программу, с помощью рекурсии:

Определить значение отношения максимального и минимального из последовательности введенных ненулевых чисел (условие завершения ввода чисел выбрать самостоятельно).

(Буду очень признателен, заранее спасибо.)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2010, 22:08     Рекурсия
Посмотрите здесь:

Рекурсия C++
Рекурсия C++
Рекурсия C++
Рекурсия C++
Рекурсия (на С) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
StUser
11 / 11 / 1
Регистрация: 09.10.2010
Сообщений: 23
10.10.2010, 00:58     Рекурсия #2
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <vector>
 
using namespace std;
 
template< typename Type, 
          template <typename, typename> class Container >
Type find_max( typename Container<Type, allocator<Type> >::iterator beg, 
               typename Container<Type, allocator<Type> >::iterator end )
{
  Type i1 = *beg++;
  if (beg == end) return i1;
  Type i2 = find_max< Type, Container >(beg, end);
  return i1 > i2 ? i1 : i2;
}
 
 
template< typename Type, 
          template <typename, typename> class Container >
Type find_min( typename Container<Type, allocator<Type> >::iterator beg, 
               typename Container<Type, allocator<Type> >::iterator end )
{
  Type i1 = *beg++;
  if (beg == end) return i1;
  Type i2 = find_min< Type, Container >(beg, end);
  return i1 < i2 ? i1 : i2;
}
 
 
int main()
{
  vector<double> a;
  double i;
  while (cin >> i && i!=0) a.push_back(i);
  cout << find_max< double, vector >(a.begin(), a.end()) /
          find_min< double, vector >(a.begin(), a.end()) 
       << endl;
 
  return 0;
}
Хотя, искать min/max рекурсией - это, конечно, извращение
NeroAngelo
0 / 0 / 0
Регистрация: 21.03.2010
Сообщений: 8
10.10.2010, 01:35  [ТС]     Рекурсия #3
Знаю)) Просто препод потребовал сделать так лабораторку))) Пасиб тебе =)
StUser
11 / 11 / 1
Регистрация: 09.10.2010
Сообщений: 23
10.10.2010, 01:44     Рекурсия #4
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <vector>
 
using namespace std;
 
template< typename Type >
Type min(Type i1, Type i2)
{
  return i1 < i2 ? i1 : i2;
}
 
template< typename Type >
Type max(Type i1, Type i2)
{
  return i1 > i2 ? i1 : i2;
}
 
template< typename Type, 
          template <typename, typename> class Container >
Type find_minmax( typename Container<Type, allocator<Type> >::iterator beg, 
                  typename Container<Type, allocator<Type> >::iterator end,
                  Type (*f)(Type, Type) )
{
  Type i1 = *beg++;
  if (beg == end) return i1;
  Type i2 = find_minmax< Type, Container >(beg, end, f );
  return f(i1,i2);
}
 
int main()
{
  vector<double> a;
  double i;
  while (cin >> i && i!=0) a.push_back(i);
 
  cout << find_minmax< double, vector >(a.begin(), a.end(), max<double>)/
          find_minmax< double, vector >(a.begin(), a.end(), min<double>)
       << endl;
 
  return 0;
}
Так еще круче
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.10.2010, 17:12     Рекурсия #5
не факт, что точно по заданию, но сделал рекурсивным почти всё...
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void fill_array(int * arr, size_t size, int limit){
    if ( ! size )
        return;
    *arr = rand() % limit + 1;
    fill_array(++arr, --size, limit);
}
 
int * max_element(int * arr, size_t size){
    return ( ! size ) ? NULL : ( size == 1 ) ? arr : ( *arr > *(arr + size - 1) ) ? max_element(arr, --size) :
        max_element(++arr, --size);
}
 
int * min_element(int * arr, size_t size){
    return ( ! size ) ? NULL : ( size == 1 ) ? arr : ( *arr < *(arr + size - 1) ) ? min_element(arr, --size) :
        min_element(++arr, --size);
}
 
double max_min_relation(int * arr, size_t size){
    return (double)*max_element(arr, size) / (double)*min_element(arr, size);
}
 
void print_array(const int * arr, size_t size){
    if ( ! size )
        return;
    printf("%d%c", *arr, ( size > 1 ) ? ' ' : '\n');
    print_array(++arr, --size);
}
 
#define SIZE 5
 
int main(void){
    int arr[SIZE];
 
    srand(time(NULL));
 
    fill_array(arr, SIZE, 10);
    printf("Array:\n");
    print_array(arr, SIZE);
    printf("Relation between max and min elements: %.1f\n", max_min_relation(arr, SIZE));
 
    exit(0);
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
11.10.2010, 13:43     Рекурсия #6
Как-то все сложно у вас получилось. И зачем использовать векторы/массивы, если у нас есть рекурсия?
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
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <limits>
 
double ratio(double min, double max)
{
    double number;
    std::cout << "> ";
    if(std::cin >> number)
    {
        if(number == 0)
        {
            std::cout << "Нуль проигнорирован" << std::endl;
            return ratio(min, max);
        }
        if(min > number)
            min = number;
        if(max < number)
            max = number;
        return ratio(min, max);
    }
    std::cout << std::endl;
    return max / min;
}
 
int main()
{
    std::cout << "Введите последоваетельность чисел (Ctrl+D или Ctrl+Z для"
        << " завершения ввода): " << std::endl;
    double result = ratio(std::numeric_limits<double>::max(),
                        std::numeric_limits<double>::min());
    std::cout << "Отношение максимального и минимального числа равно " << result
        << std::endl;
        
    return 0;
}
Yandex
Объявления
11.10.2010, 13:43     Рекурсия
Ответ Создать тему
Опции темы

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