如何计算递归划分的次数?

时间:2019-09-23 16:57:16

标签: python recursion

我目前正在上一门计算机科学课程,我得到了一个使用Python或伪代码的作业,要求用户输入一个数字,然后将其除以2,然后计算达到1所需的除法数(并在达到1时再添加1)。我以前从未编码,但我想到了。但是无论我输入什么,它都只会返回1。

def divTime (t):
  if d <= 1:
    return t + 1
  else:
    return t + 1, divTime(d / 2)

d = input("Enter a number:")
t = 0
print (divTime)(t)

4 个答案:

答案 0 :(得分:1)

您可以将输入数字由2除以2,直到递归调用加1,直到输入数字变为1,此时返回1:

def divTime(d):
    if d == 1:
        return 1
    return 1 + divTime(d // 2)

这样:

print(divTime(1))
print(divTime(3))
print(divTime(9))

输出:

1
2
4

答案 1 :(得分:0)

这有效:

def div_time(d, t=0):
    if d < 1:
        return t
    else:
        return div_time(d/2, t+1)

d = input("Enter a number:")
print(f"t = {div_time(int(d))}")

答案 2 :(得分:0)

它总是返回1,因为您总是传递0。

您似乎在“循环中思考” –您不需要单独的计数器变量。

除法需要多少次:

  • k小于2?没有。
  • k大于或等于2?除k // 2之外,还要多花一个。

也就是说,

def divTime(x):
    if x < 2:
        return 0
    return 1 + divTime(x // 2)

def divTime(x):
    return 0 if x < 2 else 1 + divTime(x //2)

答案 3 :(得分:0)

我不会为您提供直接的答案,而是将问题分为几个步骤:

现在暂时忽略输入和边缘情况,让我们集中精力编写一个解决当前问题的函数,然后我们可能会回过头来为该函数提供输入。

问题语句的混淆-您经常会用奇数除以余数,由于余数会跳过精确的数字1。处理余数会导致您的问题含糊不清-我们将重新编写问题说明:
编写一个函数,该函数返回将输入整数除以使其小于或等于1所需的次数。

下一部分是确定可以解决此类问题的算法的类型。由于我们想使用相同的函数运行函数未知次数,因此这似乎是递归的理想用例。

说我提供10作为输入。然后,我们想说10/2 = 5(计数1),5/2 = 2.5(计数2),2.5 / 2 = 1.25(计数3),1.25 / 2 = 0.625(计数4),返回[4]个计数。

现在,我们知道我们需要一个计数器(x = x + 1),递归和一个return / print语句。

class solution:
    ''' this class will print the number of times it takes to divide an integer by 2 to become less than or equal to 1 '''
    def __init__(self):
        #this global counter will help us keep track of how many times we divide by two. we can use it in functions inside of this class.
        self.counter=0

    def counter_2(self, input_integer):
        #if the input number is less than or equal to 1 (our goal), then we finish by printing the counter.
        if input_integer<=1:
            print(self.counter, input_integer)
        #if the input is greater than 1, we need to keep dividing by 2.
        else:
            input_integer=input_integer/2
            #we divided by two, so make our counter increase by +1.
            self.counter=self.counter+1
            #use recursion to call our function again, using our current inputer_integer that we just divided by 2 and reassigned the value.
            self.counter_2(input_integer)

s=solution()
s.counter_2(10)