Как определить сумму группы целых чисел без использования рекурсии

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

Это проблема, которую я подумал, и теперь мне немного смущен, чтобы сказать, но из меня избивают живые дневные моменты. Обратите внимание, что это не домашнее управление, честь скаута.

В основном программа берет (в качестве ввода) строка, состоящей из целых чисел от 0 до 9.

strInput = '2415043'

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

iTarget = 289

Для этого примера есть два правильных ответа (но, скорее всего, будет отображаться только, поскольку программа останавливается после достижения цели):

Answer 1 = 241, 5, 043    (241 + 5 + 043    = 289)  

Ответ 2 = 241, 5, 0, 43 (241 + 5 + 0 + 43 = 289)

Обратите внимание, что целые числа не меняют положение. Они все еще в том же порядке, что они были в исходной строке.

Теперь я знаю, как решить эту проблему, используя рекурсию. Но разочаровывающая часть состоит в том, что Мне не разрешено использовать рекурсию.

Это должно быть решено с использованием только «пока» и «для» петель. и очевидно, а также в порядке.

Ниже приведен некоторый код, который у меня есть до сих пор:

Мой код:

                                         #Pre-defined input values, for the sake of simplicity
lstInput = ['2','4','1','5','0','4','3'] #This is the kind of list the user will input
sJoinedList = "".join(lstInput)          #sJoinedList = '2415043'
lstWorkingList = []                      #All further calculuations are performed on lstWorkingList
lstWorkingList.append(sJoinedList)       #lstWorkingList = ['2415043']
iTarget = 289                            #Target is pre-defined

-

def SumAll(_lst):          #Adds up all the elements in a list
   iAnswer = 0             #E.g. lstEg = [2,41,82]
     for r in _lst:        #     SumAll(lstEg) = 125
       iAnswer += int(r)
   return(iAnswer) 

-

def AddComma(_lst):
                                  #Adds 1 more comma to a list and resets all commas to start of list
                                  #E.g. lstEg = [5,1001,300]  (Note only 3 groups / 2 commas)
                                  #     AddComma(lstEg)
                                  #     [5,1,0,001300] (Now 4 groups / 3 commas)
    iNoOfCommas = len(_lst) - 1   #Current number of commas in list
    sResetString = "".join(_lst)  #Make a string with all the elements in the list
    lstTemporaryList = []
    sTemp = ""
    i = 0
    while i < iNoOfCommas +1:
        sTemp += sResetString[i]+','    #Add a comma after every element
        i += 1
    sTemp += sResetString[i:]       
    lstTemporaryList = sTemp.split(',') #Split sTemp into a list, using ',' as a separator
                                        #Returns list in format ['2', '415043'] or ['2', '4', '15043']
    return(lstTemporaryList)
    return(iAnswer)

Так что в основном, псевдокод будет выглядеть что-то подобное:

псевдо- Код:

while SumAll(lstWorkingList) != iTarget:      #While Sum != 289
    if(len(lstWorkingList[0]) == iMaxLength): #If max possible length of first element is reached
        AddComma(lstWorkingList)              #then add a new comma / group and
        Reset(lstWorkingList)                 #reset all the commas to the beginning of the list to start again
    else:
        ShiftGroups()                         #Keep shifting the comma's until all possible combinations
                                              #for this number of comma's have been tried
                                              #Otherwise, Add another comma and repeat the whole process

Феве! Это было довольно точкой.

Я проработал процесс, который программа будет следовать на листе бумаги, поэтому ниже ожидаемый выход:

Выход:

[2415043]  #Element 0 has reached maximum size, so add another group 
#AddComma()
#Reset()
[2, 415043] #ShiftGroups()
[24, 15043] #ShiftGroups()
[241, 5043] #ShiftGroups()
#...etc...etc...
[241504, 3] #Element 0 has reached maximum size, so add another group
#AddComma()
#Reset()
[2, 4, 15043] #ShiftGroups()
[2, 41, 5043] #ShiftGroups()
#etc...etc...

[2, 41504, 3] #Tricky part

Теперь вот сложная часть. На следующем шаге первый элемент должен стать 24, а два других должны сбросить.

#Increase Element 0
#All other elements Reset() 
[24, 1, 5043] #ShiftGroups()
[24, 15, 043] #ShiftGroups()
#...etc...etc

[24, 1504, 3]
#Increase Element 0
#All other elements Reset()
[241, 5, 043] #BINGO!!!!

Хорошо. Это основной поток логики программы. Теперь единственное, что мне нужно выяснить, - это то, как заставить его работать без рекурсии.

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

Спасибо снова!

Редактировать: 1 сентября 2011 года

Спасибо всем за ответ и за ваши ответы. Они все очень хорошо, и, безусловно, более элегантны, чем маршрут, который я следовал. Тем не менее, мои студенты никогда не работали с «импортным» или любыми структурами данных более продвинуты, чем списки. Они делают, однако, знают довольно несколько функций списка. Я также должен указать, что студенты довольно одарены математически, многие из них соревновались и помещены в международные математические олимпиады. Так что это назначение не за пределами объема Их интеллект, возможно, только за пределами объема их знаний Python.

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

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

снова спасибо за ваш вклад. Я выберу лучший ответ после выходных. С Уважением!

7
задан Victor Grobler 1 September 2011 в 06:45
поделиться