Домашнее задание на Python - не имеет смысла - PullRequest
3 голосов
/ 19 января 2012

Хорошо, наш профессор объяснил (вроде) эту проблему, но она все еще не имеет особого смысла.

Вопрос: Реализуйте функцию knice(f,a,b,k), которая будет возвращать 1, если для некоторого целого числа a <= x <= b инекоторое целое число n <= k, n применений f к x будет x, (например, f(f(f...(f(x)))) = x) и 0, если нет.

То, что предоставил профессор, было:

def knice(f,a,b,k):
    f(f(f(...(f(x)))) = x
    for i = a to b:
        y = f(i)
        if y = i break
    for j = z to k:
        y = f(y)
        if y = i break

Лично для меня этот пример не имеет смысла, так что посмотрим, смогу ли я получить разъяснения.

OP EDIT 19.01.2012 15:03 CST

Этопоследняя функция, которая была вычислена с помощью GTA:

def f(x):
    return 2*x-3

def knice(f,a,b,k):
x = a
while x <= b:
    n = 1
    y = f(x)
    if y == x:
        return 1
    while n <= k:
        y = f(y)
        n=n+1
        if y == x:
            return 1
    x=x+1   
return 0

Ответы [ 3 ]

5 голосов
/ 19 января 2012

игнорировать его код; Вы должны написать все, что вам удобно, и отработать изгибы позже.

Вы хотите узнать, будет ли

  • f(a) = a, или f(f(a)) = a, или ..., или f^n(a) = a, или ,
  • f(a+1) = a+1, или f(f(a+1)) = a+1, или ..., или f^n(a+1) = a+1, или ,
  • ...
  • f(b) = b, или f(f(b)) = b, или ..., или f^n(b) = b.

Очевидный алгоритм должен сразу прийти на ум: попробуйте все эти значения по одному! Вам понадобятся два (вложенных) цикла, потому что вы перебираете прямоугольник значений. Теперь ты видишь, что делать?

4 голосов
/ 19 января 2012

Да, я понимаю, почему это может сбивать с толку.

Был ли f(f(f(...(f(x)))) = x заключен в тройные двойные кавычки? Это строка документации функции, вроде как комментирует ваш код. Он не должен был быть изолированным, если бы что-то его не защищало.

Представьте, что f назывался increment_by_one.

Вызов increment_by_one в 10 раз больше, чем при x, равном 2, даст 12. Независимо от того, сколько раз вы увеличиваете, кажется, вы никогда не вернетесь 2. 2. 1008 *

Теперь представьте, что f назывался multiply_by_one.

Вызов multiply_by_one 5 раз, как это при x 3, даст 3. Sweet.

Итак, некоторые примеры выходных данных, с которыми вы можете проверить (вы должны написать функции)

knice(increment_by_one, 1, 3, 5) вернет 0.

knice(multiply_by_one, 1, 3, 5) вернул бы 1.

Как еще один совет, отступы важны в python.

0 голосов
/ 19 января 2012

Вот конкретный пример.Начните с малого, и предположим, что вы позвонили knice(f, a=1, b=2, k=1).Для k==1 нам не нужно беспокоиться об итерации функции.Единственными значениями x, которые следует учитывать, являются 1 и 2, поэтому knice может вернуть 1 (т. Е. True), если f(1)==1 или f(2)==2.

Теперь предположим, что вы позвонили knice(f, a=1, b=2, k=2).Вам также нужно будет проверить f(f(1)) и f(f(2)).

По мере увеличения k вам придется звонить f больше.И по мере того, как диапазон между a и b увеличивается, вам придется использовать большее количество значений x в качестве аргумента для f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...