Генерация расширяющегося списка списков

#python #recursion

#python #рекурсия

Вопрос:

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

Я хотел бы сгенерировать матрицу (список списков) в течение n лет, чтобы посмотреть на все возможные результаты роста заработной платы.

Зарплата должна быть больше 0 и меньше 10000. Я хочу увеличить количество блоков по 500.

 salary_range = range(0,10000)
salary_increment = 500
  

Таким образом, в 0 году зарплата может составлять 500,1000,1500 …..9500,10000

Затем в год 1 для каждого значения предыдущего года оно может увеличиваться кратно 500, если оно составляет менее 100000. т. е. 1000 500*0, 1000 500*1….

Это будет делать это в течение n лет

В конце я хотел бы надеяться получить список списков списков, в котором вложенный список содержит n элементов, каждый из которых представляет зарплату на данный момент времени.

например

 [
 [0,0,0,0]
 [0,0,0,500]
 [0,0,0,1000]
 .........
 [10000,10000,10000,9500]
 [10000,10000,10000,10000]

]

  

Я решил, что способ генерации приращений будет выглядеть так

 def nextone(pv):
    global salary_max
    salary_increment = 500
    next_vals = []

    for i in range(0,n):
        nv = pv i*salary_increment
        next_vals.append(nv)
  

Это выдает список из одного значения, но как я могу сгенерировать это рекурсивно (если это правильно)?

Ответ №1:

Вам действительно не нужна рекурсия. Если вы хотите сгенерировать матрицу, просто используйте 2 цикла for:

 all_salary = []
start_salary = [0,0,0,0]
for i in range(3, -1, -1):
    for salary in range(0, 10001, 500):
        start_salary[i] = salary
        print(start_salary)
  

дает нам

 [0, 0, 7500, 10000]
[0, 0, 8000, 10000]
[0, 0, 8500, 10000]
[0, 0, 9000, 10000]
[0, 0, 9500, 10000]
[0, 0, 10000, 10000]
[0, 0, 10000, 10000]
[0, 500, 10000, 10000]
[0, 1000, 10000, 10000]
[0, 1500, 10000, 10000]
[0, 2000, 10000, 10000]
[0, 2500, 10000, 10000]
  

обратите внимание, что мы получаем [0, 0, 10000, 10000] дважды, один в конце второго цикла и один в начале первого.

Затем нам нужно сохранить их в один объект, но приведенный ниже код дает нам список списков, полный 10000, потому что он добавляет один и тот же объект start_salary , который в конечном итоге равен [10000, 10000, 10000, 10000] для all_salary:

 all_salary = []
start_salary = [0,0,0,0]
for i in range(3, -1, -1):
    for salary in range(0, 10001, 500):

        start_salary[i] = salary
        print(start_salary)
        all_salary.append(start_salary)
  

Чтобы обойти это, я просто расширяю all_salary с помощью start_salary, а затем измельчаю его так, как мне нужно для создания списка списков:

 n = 4
[all_salary[i:i   n] for i in range(0, len(all_salary), n)]
  

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

1. Спасибо, это интересно посмотреть. Я попробовал другой способ добавления all_salary.append(eval(str(start_salary))) Не могли бы вы сказать мне, почему вы настроили его на обратную работу?

2. @Charlie что вы имеете в виду под «заставить его работать в обратном направлении»?