Я написал следующую программу для простого разложения на числа:
import math def prime_factorize(x,li=[]): until = int(math.sqrt(x))+1 for i in xrange(2,until): if not x%i: li.append(i) break else: #This else belongs to for li.append(x) print li #First print statement; This is what is returned return li prime_factorize(x/i,li) if __name__==’__main__’: print prime_factorize(300) #Second print statement, WTF. why is this None
Ниже приведен вывод, который я получаю:
[2, 2, 3, 5, 5] None
Altho ‘, возвращаемое значение печатается правильно, после возвращенного значения, кажется, не печатает ничего, все время. Что мне не хватает?
Кроме того, как я могу улучшить программу (продолжая использовать рекурсию)
lprsd 12 Сен 2009 в 11:50
5 ответов
Лучший ответ
Ваша функция prime_factorize не имеет оператора return в рекурсивном случае — вы хотите вызвать «return prime_factorize (x / i, li)» в его последней строке. Попробуйте сделать это с простым номером (чтобы рекурсивный вызов не требовался), чтобы убедиться, что он работает в этом случае.
Самый БЫСТРЫЙ стандартный цикл Python − Интеграция с языком Си
Также вы, вероятно, хотите сделать подпись что-то вроде:
def prime_factorize(x,li=None): if li is None: li = []
В противном случае вы получите неправильные результаты при вызове его два или более раз:
>>> prime_factorize(10) [2, 5] >>> prime_factorize(4) [2, 5, 2, 2] >>> prime_factorize(19) [2, 5, 2, 2, 19]
Anthony Towns 12 Сен 2009 в 08:05
def primeFactorization(n): «»» Return the prime factors of the given number. «»» factors = [] lastresult = n while 1: if lastresult == 1: break c = 2 while 1: if lastresult % c == 0: break c += 1 factors.append(c) lastresult /= c return factors
Dickson Xavier 9 Авг 2011 в 06:24
Более функциональная версия.
def prime_factorize( number ): def recurse( factors, x, n ): if x 1+x**0.5: # reached the upper limit factors.append( x ) # the only prime left is x itself return factors if x%n==0: # x is a factor factors.append( n ) return recurse( factors, x/n, n ) else: return recurse( factors, x, n+1 ) return recurse( [], number, 2) for num, factors in ((n, prime_factorize( n )) for n in range(1,50000)): assert (num==reduce(lambda x,y:x*y, factors, 1)), (num, factors) #print num, «:», factors
Jochen Ritzel 12 Сен 2009 в 13:59
def prime_factorize(x): li = [] while x >= 2: until = int(math.sqrt(x))+1 for i in xrange(2,until): if not x%i: li.append(i) break else: li.append(x) return li x //= i
Это не решает важные проблемы производительности (поведение big-O такое же, как и в исходном решении), но поскольку сам Python не выполняет оптимизацию хвостовой рекурсии, важно научиться делать это вручную.
«Измените [не базовый случай] рекурсивные шаги ‘return thisfun(newargs)’ на args=newargs; continue и поместите все тело в цикл while True: » — основная идея оптимизации хвостовой рекурсии. Здесь я также сделал li неаргомом (без причины быть аргументом), наложил условие на while и избежал continue , так как рекурсивный шаг был в конце тело в любом случае.
Самые популярные Python приложения и веб-сайты
Эта формулировка послужит хорошей основой для дальнейшего оптимизации оптимизации рефакторинга (избегание, напоминание и т. Д.) Для достижения более высокой производительности.
Alex Martelli 12 Сен 2009 в 15:04
Если вы хотите сделать это полностью рекурсивным, я бы порекомендовал этот код, он действительно возвращает правильный ответ, и способ его работы довольно ясен. Если вы хотите сделать программу максимально эффективной, я бы порекомендовал вам придерживаться одного из ваших предыдущих методов.
def primeFact (i, f): if i < f: return [] if i % f == 0: return [f] + primeFact (i / f, 2) return primeFact (i, f + 1)
Это полностью рекурсивный способ решения вашей проблемы
>>> primeFact (300, 2) [2, 2, 3, 5, 5] >>> primeFact (17, 2) [17] >>> primeFact (2310, 2) [2, 3, 5, 7, 11]
Источник: question-it.com
Программа Python для поиска самого большого элемента в кортеже
Программирование и разработка
На чтение 3 мин Просмотров 84 Опубликовано 25.11.2022
Учитывая кортеж, задача состоит в том, чтобы написать программу на Python, чтобы найти наибольшее число в кортеже.
Пример:
Input: (10,20,23,5,2,90) #tuple Output: 90
Значения кортежа синтаксически разделяются запятыми. Хотя это и не обязательно, чаще кортеж определяют, заключая последовательность значений в круглые скобки. Это помогает легче понять кортежи Python.
Программа Python для демонстрации максимального элемента в кортеже.
Способ 1: Использование метода max()
Самая большая программа в python
Don’t learn to code. Code to learn!
Введение в Python
- Python — Обзор
- Основы синтаксиса Python
- Операторы в Python
- Типы данных в Python
- Условные конструкторы в Python
- Циклы в Python
- Функции в Python
- Функциональное программирование в Python
- ООП в Python
- Модули в Python
- Работа с файлами в Python
- Обработка исключительных ситуаций в Python
Сегодня мы напишем приложение-пример, которое будет принимать от пользователя его имя и результат, после чего — форматировать и записывать в файл список из 10 лучших результатов. Это достаточно простое приложение, однако на его примере мы попрактикуемся в работе с файлами в Python, генерации списков, продвинутой работе со строками, расширенном использовании метода sort, обработке исключительных ситуаций.
Узнаем имя и результат пользователя:
name = input(‘Your name: ‘) score = input(‘Your score: ‘)
Тепер открываем файл с результатами, eсли файла не существует — создадим его и заполним демо-данными:
try: scores = open(«scores.txt») except (OSError, IOError): scores = open(‘scores.txt’, ‘w’) scores.write(‘1. AAA 1000n2. CCC 700n3. BBB 200’) scores.close() scores = open(«scores.txt»)
Читаем содержимое файла и форматируем список content. В файле хранятся записи формата:
Позиция. Имя Результат
Список content генерируется следующим образом:
scores = open(«scores.txt») content = [‘<> <>’.format(s.split()[1], s.split()[2]) for s in scores.read().split(‘n’)] scores.close()
На первой строке мы открываем файл scores.txt, на последней — закрываем. Самое интересное происходит посередине. Мы читаем содержимое файла и создаем список из строк формата ‘Имя Результат’. Далее мы добавляем в этот список строку содержащую введенные нами имя и результат.
content.append(‘<> <>’.format(name, score))
После этого, наша задача отсортировать весь список на основе результата. Для этого воспользуемся встроенной функцией sort.
content.sort(key=get_key, reverse=True)
reverse=True означает, что список будет форматироваться от большего к меньшему. В Python функция sort позволяется нам работать очень гибко, одним из параметров, которые она принимает, является ключевой аргумент key, которым мы можем задать функцию на основе которой будет производится сортировка. Давайте напишем такую функцию (обратите внимание, что функция должна быть определена до строки content.sort. ):
def get_key(item): return int(item.split()[1])
Готово! Список отсортирован. Теперь нужно перезаписать файл scores.txt, заполнив его десятью лучшими результатами. Для начала создадим переменную text:
text = ‘n’.join([‘<>. <>’.format(i, item) for i, item in enumerate(content[:10], start=1)])
Эта запись может напугать новичка, но по сути это более корректный вариант создания строки из списка. Мы могли бы заменить ее записью:
text = » for i, item in enumerate(content[:10], start=1): text += ‘<>. <>n’.format(i, item)
Однако такой вариант это по сути лишняя трата процессорного времени и лишние строки в коде.
Напечтаем то, что у нас получилось, чтобы получить хоть какую-то визуализацию, и запишем переменную в файл:
print(text) scores = open(«scores.txt», ‘w’) scores.write(text) scores.close()
Все работает, как и ожидалось!
Получаем вот такую картину
- Перегрузка операторов в Python
- Пятнашки на Python
- Паттерны проектирования в Python
- Множествeнное наследование в Python
- Абстрактные классы в Python
Источник: www.pythonicway.com