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

Рекурсивно определить, мржно ли заданную сумму денег разменять монетами по 3, 10, 15 копеек

03.08.2012, 12:50. Показов 4543. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Подскажите, пожалуйста, где ошибка в решении следующей задачи: написать программу, которая рекурсивно позволяет определить, можно ли заданную сумму разменять монетами по 3, 10, 15 копеек.
Программа выдаёт результат только для суммы, равной 30. Сама я думаю, что ошибка во второй части программы, в месте вызова функции (номер строки 32).


Код следующий:

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
bool divide(int sum, int money[])
{
    if (sum == 0)
    {
        return true;
    }
    else
    {
        for (int i = 0; i < sizeof(money); i++)
        {
            int tempsum = sum - money[i];
 
            if(divide(tempsum, money))
            {
                return true;
            }
        }
    }
 
    return false;
}
    
void _tmain(int argc, _TCHAR* argv[])
{
    int const size = 3;
    int A[size] = {3, 10, 15};
    int sum;
 
    printf("Enter summa:\n");
    scanf("%i", &sum);
 
    if(divide(sum,A))
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }
 
    printf("\n");
}
Использование рекурсии вызывает у меня трудности, я никак не могу её понять, хотя решаю уже не первую задачу. Я буду очень благодарна, если кто-нибудь посоветует мне какие-нибудь источники, где на примитивном уровне для совсем начинающих программистов будет изложена рекурсия.
Заранее большое спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2012, 12:50
Ответы с готовыми решениями:

Определить, можно ли разменять сумму в N копеек данными монетами
Задача 12. Имеются монеты достоинством 10,15,20,50 копеек. Определить, можно ли разменять сумму в N...

Сколькими способами можно разменять 10 копеек монетами по 1, 2, 3 и 5 копеек?
Помогите решить задачу пожалуйста &quot;сколькими способами можно разменять 10 копеек монетами по 1 2 3...

Подсчет количества способов, которыми можно разменять рубль медными монетами (достоинством 1, 2, 3, 5 копеек)
составить алгоритм подсчета количества способов, которыми можно разменять рубль медными...

Способы потратить определенную сумму денег определенными монетами
У Вас А монет по Х рублей и В монет по Y рублей. Можно ли с их помощью заплатить Z рублей, если да...

5
Z3JheSBoYXQ=
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
03.08.2012, 14:12 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
#include <stdio.h>
#define true 1
#define false 0
 
int check(int a, int some) {
    if (!(a % some)) {
         return (true);
    } else {
    return(false);
}
}
    
int main(){
    int a, t;
    int s[3]={3,10,15};
        printf("enter some value: ");
        scanf("%d", &a);
        for(t=0; t<=4; t++){
            if (check(a,s[t])){
                    printf("\nсумму %d можно разменять на %d\n", a, s[t]);
            } else {
                    printf("\nсумму %d нельзя разменять на %d\n", a, s[t]);
            }
    }
    return 0;
}
для новичка советую изучать голое си, по итогам изучения будет ясное представление что и как работает. Из плюсов изучение голого си, что очень много качественной документации с массой примеров и задач на все уровни становления молодого кодера. Харви Дейтел "Как программировать на Си", Стефан Кочан "Программирование на языке Си".
По рекурсии. Представь ситуацию что ты собираешь яблоки упавшие с дерева. В этом механизме сбора яблок есть фрагмент, который повторяется регулярно. Это наклон, взятия яблока, помещения яблока в корзину. Вот эти три действия можно поместить в отдельную функцию и к примеру вызывать ее в зависимости от количества упавших яблок. Ясно?
0
1728 / 1020 / 181
Регистрация: 03.06.2012
Сообщений: 1,220
03.08.2012, 15:32 3
Цитата Сообщение от fanatdebian Посмотреть сообщение
вызывать ее в зависимости от количества
Это, скорее, не рекурсия, а итерация.

Наиболее простой пример рекурсии - вычисление факториала: если нужно вычислить N!, то можно вычислить (N-1)! и результат умножить на N.

Характерная черта рекурсии - сведение задачи к аналогичной, как правило, более простой (в примере - сведение вычисления N! к к вычислению (N-1)!), а не явное повторение какой-либо операции.

В данной задаче можно рассуждать похожим образом: данную сумму S можно разменять указанным образом, если указанным образом можно разменять сумму S-3, S-5 либо S-15. При этом, как всегда, важно позаботиться о проверке условия завершения рекурсии (чтобы избежать бесконечной рекурсии).
1
349 / 299 / 166
Регистрация: 15.03.2012
Сообщений: 653
Записей в блоге: 1
03.08.2012, 17:35 4
Привет Selin-a.
Я твой код слегка изменил, также и _tmain и _TCHAR.
Ты сама посмотри чтобы у тебя в среде всё работало.
У меня работает.

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
#include <stdio.h>
#define SIZE 3
 
int divide(int sum, int money[])
{
    int counter = 0;
    int temp_sum;
 
    temp_sum = sum;
    while(money[counter]) {
        temp_sum = sum - money[counter];
        if (0 == temp_sum) return 1;
        if (0 >  temp_sum) return 0;
        counter++;
    }
    return divide(temp_sum, money);
        
}
        
    
void main(int argc, char *argv[])
{
    int Arr[SIZE+1] = { 3, 10, 15, 0 }; // последний элемент НОЛЬ,
    int sum;                             // для использования в while().
 
    printf("Enter summa: ");
    scanf("%i", &sum);
 
    if(divide(sum,Arr))
    {
        printf("Yes");
    }
    else
    {
        printf("No");
    }
 
    printf("\n");
}
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36601 / 20330 / 4220
Регистрация: 12.02.2012
Сообщений: 33,643
Записей в блоге: 13
03.08.2012, 17:37 5
Вот решение, основанное на идее Splen-а:

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
#include "iostream.h"
 
int Chk(int n)
{
    if (n < 0) return 0;
    if ((n == 3) || (n == 10) || (n == 15)) return 1;
    return Chk(n-3) || Chk(n-10) || Chk(n-15);
}
 
int main(int argc, char* argv[])
{
    int k;
 
    while (1)
    {
        cout << "Enter sum  (0 - end)  ";
        cin >> k;
 
        if (k == 0) break;
 
        if (Chk(k))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
 
    return 0;
}
Миниатюры
Рекурсивно определить, мржно ли заданную сумму денег разменять монетами по 3, 10, 15 копеек  
2
0 / 0 / 0
Регистрация: 02.06.2012
Сообщений: 8
03.08.2012, 19:21  [ТС] 6
Большое всем спасибо за помощь
0
03.08.2012, 19:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.08.2012, 19:21
Помогаю со студенческими работами здесь

Определить номер самого дорого товара, который намерен приобрести покупатель, имеющий заданную сумму денег
Имеются данные о ценах на десять видов товаров. Определить номер самого дорого товара, который...

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

Какое наибольшее количество бутылок воды можно купить, имея некоторую сумму денег S копеек?
бутылка воды стоит 45 копеек. Пустые бутылки сдаются по 20 копеек, и на полученные деньги опять...

Дана некоторая сумма денег. Разменять эту сумму банкнотами 1, 3, 5, 10, 20 так, чтобы количество банкнот было минимальным.
Дана некоторая сумма денег. Разменять эту сумму банкнотами 1, 3, 5, 10, 20 так, чтобы количество...


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

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