рекурсивная программа - PullRequest
1 голос
/ 24 мая 2010

Я пытаюсь создать рекурсивную программу, которая рассчитывает процент за год. Он запрашивает у пользователя начальную сумму (1000), процентную ставку (10%) и количество лет (1).

Вручную я понял, что проценты поступают по формуле YT (1 + R) ----- проценты за первый год, который составляет 1100.

2-й год YT (1 + R / 2 + R2 / 2) // R в квадрате

2-й год YT (1 + R / 3 + R2 / 3 + 3R3 /) // R в кубах

Как мне написать рекурсивную программу, которая будет рассчитывать проценты? Ниже приведена функция, которую я попробовал

// Последний раз после редактирования

double calculateInterest2(double start, double rate, int duration) 
{ 
    if (0 == duration) { 
        return start; 
    } else { 
        return (1+rate) * calculateInterest2(start, rate, duration - 1); 
    } 
} 

Ответы [ 5 ]

6 голосов
/ 24 мая 2010

Я взял на себя смелость протестировать вашу функцию в Java (синтаксис аналогичен), и он дал странные результаты. Вот что я получил:

calculateInterest2(1000, .1, 0); // = 1000.0
calculateInterest2(1000, .1, 1); // = 1200.0
calculateInterest2(1000, .1, 2); // = 1420.0
calculateInterest2(1000, .1, 3); // = 1662.0
calculateInterest2(1000, .1, 4); // = 1928.2

Очевидно, это не правильно. Прежде всего, обратная строка также повторно применяет вычисление .... Вот переписывание метода:

static private double calculateInterest2(double start, double rate, int duration)
{
    if (0 == duration) {
        return start;
    } else {
        return (1+rate) * calculateInterest2(start, rate, duration - 1);
    }
}

Как видите, этот метод проверяется с помощью следующих выводов:

calculateInterest2(1000, .1, 0); // = 1000.0
calculateInterest2(1000, .1, 1); // = 1100.0
calculateInterest2(1000, .1, 2); // = 1210.0
calculateInterest2(1000, .1, 3); // = 1331.0
calculateInterest2(1000, .1, 4); // = 1464.1000000000001

Звучит правее для меня.

2 голосов
/ 24 мая 2010

В основном, рекурсивная функция F работает путем вычисления ответа для F (N) из ответа для F (N-1) плюс дополнительная работа для N-го случая.И, конечно, вы должны предоставить конечный результат для N == 0 (или 1 или чего-то еще)

Так что в вашем случае сложный процент за год N будет:

  Interest(S,R,N) = (S + Interest(S,R,N-1)) * R

где

  Interest(S,R,0) = S * R

И вы сможете изменить свой код, чтобы довольно легко это представить.

1 голос
/ 24 мая 2010

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

В этом случае вы хотите остановиться, если число лет равно 0. Если вы храните деньги в банке в течение 0 лет, вы не будете получать проценты, поэтому в случае 0 вы хотите вернуть 0.

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

return (startUp*rate) + calculateInterest(startUp*(1+rate), rate, duration-1);
1 голос
/ 24 мая 2010

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

return calculateInterest(cpdInterest, rate, duration - 1);

Кроме того, вы можете изменить duration на int или обработать случай 0 < duration < 1.

0 голосов
/ 20 октября 2013

Я сделал эту программу, используя функции в C

//include standard libraries

#include<stdio.h>

//user defined function

float cmp_i(float prin,float rate,int time);

//start of main function

main()
{

        //declaration of variables

        float prin,rate,ci;
        int time;

        //input by the user

        printf("Please enter the principle ammount\n");
        scanf("%f", &prin);
        printf("Please enter thr rate of interest\n");
        scanf("%f",&rate);
        printf("Please enter the time in years");
        scanf("%d", &time);

        //calculation and result display

        ci=cmp_i(prin,rate,time);
        printf("The compound interest for the given ammount is %f",ci);


}//end of main function
//start of cmp_i function


float cmp_i(float prin,float rate,int time)
{

    //declaration of variables
    int i;
    float intr=0;
    intr=(prin*rate)/100;
    for(i=01;i<=time;i++)
    {
        intr=intr+(intr*rate)/100;
    }
    return(intr);
}
...