Home > database >  while-loop proposition adding
while-loop proposition adding

Time:03-24

I want to make a bit complex code which will advice user to add some products to his cart if his total cost of it lower than his budget, but I've run into a problem that when I enter a small budget amount (which can still include a small product like sauce), the code goes into an infinite loop or just doesn't work, would like to know how to repair my code

productlist = ['Sushi', 'Spirulini', 'Sause', 'Cabbage']
pricelist = [56, 31, 4, 9]
totalcost = 0
budget = 10

proposal_list = []
i = 0

while totalcost < budget:
  if i >= len(pricelist):
    i = 0
  elif (pricelist[i]   totalcost) <= budget:
    totalcost  = pricelist[i]
    proposal_list.append(productlist[i].lower())
    joint = ', '.join(proposal_list)
    i  = 1
  elif (pricelist[i]   totalcost) > budget:
    continue 

print (f'You can also add: {joint} to your cart for a great discount!\nTotal cost will be: {totalcost}')

CodePudding user response:

The problem is that you get into a situation where both totalcost < budget and pricelist[i] totalcost > budget are true (i.e., you have some money left, but not enough for productlist[i]), but you don't change either i or totalcost, so you loop forever on the fact that you can't afford prodouctlist[i].

At no point do you actually exit the loop when you can no longer afford any product; you seem to be assuming that you will be able to spend exactly budget dollars.

Here's an example, using a for loop, that buys as many of each item as you can (a greedy method), so that you only consider each item once.

totalcost = 0

for product, price in zip(productlist, pricelist):
    while totalcost   price <= budget:
        proposal_list.append(product.lower())
        totalcost  = price

For certain price lists, this will also spend as much of your budget as possible. (This is basically the change-making problem in another guise.) For other price lists, your approach of trying to buy at least one of each item before reconsidering each item could produce a different result.

  • Related