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

#python

#python

Вопрос:

У меня есть рабочий код, хотя есть кое-что, что я не могу понять.

 def stonks(coins, rate, years):
    """
    Each year your crypto-investment grows.

    Write a recursive function that calculates the net worth of coins after some years.
    Rate is in percents.
    Round the answer down to the nearest integer.

    stonks(1000, 10, 10) -> 2593
    stonks(100000, 12, 3) -> 140492

    :param coins: starting amount (0-100000)
    :param rate: starting amount (0-100)
    :param years: starting amount (0-50)
    :return: coins after years
    """
    if years is not 0:
        return stonks((coins * (1   rate / 100)), rate, years - 1)
    else:
        return coins

  

Ожидаемый результат:

 print(stonks(1000, 10, 10))  # -> 2593
print(stonks(100000, 12, 3))  # -> 140492
  

Мой вывод:

 print(stonks(1000, 10, 10))  # -> 2593.742460100001
print(stonks(100000, 12, 3))  # -> 140492.80000000005
  

Если я добавлю math.floor(монеты * (1 ставка / 100)) -> Мой вывод:

 print(stonks(1000, 10, 10))  # -> 2591 --- incorrect, needs to be 2593.
print(stonks(100000, 12, 3))  # -> 140492 --- correct

  

Как это возможно, один из выходов правильно настроен с 140492.80000000005 до 140492, но другой вывод 2593.742460100001 неправильно настроен на 2591?

Связано ли это с тем, что количество рекурсий больше, и, следовательно, math.floor применяется к каждому событию рекурсии, что приводит к отключению конечного вывода?

Комментарии:

1. Я бы предположил, потому что это делается для каждой рекурсии, а не только для последней. Попробуйте обернуть floor функцию вокруг начального вызова stonks функции.

2. вау, это, похоже, сработало, большое вам спасибо, если бы я только мог выбрать комментарий в качестве лучшего ответа, ха-ха!

3. Все в порядке, просто рад, что у вас получилось 🙂

Ответ №1:

Вы можете просто сделать return stonks((coins * (1 rate / 100)), rate, years - 1) // 1