我将如何在此代码中实现递归?

时间:2019-01-06 13:13:55

标签: python recursion

我需要帮助。有人可以告诉我如何递归实现这些代码行吗?

我没有完全理解递归的含义。

def nextDay(year, month, day):
    """Simple version: assume every month has 30 days"""
    if day < 30:
        return year, month, day + 1
    else:
        if month == 12:
            return year + 1, 1, 1
        else:
            return year, month + 1, 1

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    counter = 0
    while not (year1==year2 and month1==month2 and day1==day2):
        year1,month1,day1 = nextDay(year1,month1,day1)
        counter += 1
    return counter

2 个答案:

答案 0 :(得分:0)

def nextDay(year, month, day):
    """Simple version: assume every month has 30 days"""
    if day < 30:
        return year, month, day + 1
    else:
        if month == 12:
            return year + 1, 1, 1
        else:
            return year, month + 1, 1
'''
Assumption is that date1 is less than date2
'''
def daysBetweenDates(year1, month1, day1, year2, month2, day2):
   if year1==year2 and month1==month2 and day1==day2: # base condition
      return 0
   else:
      y, m, d = nextDay(year1, month1, day1)
      return dateBetweenDates(y, m, d, year2, month2, day2) + 1 # check for difference between new date and final date recursively

说明:

正如注释中指出的那样,递归函数是一个调用自身的函数。

通常,我们通过检查基本条件来利用此技术。直到不满足基本条件,我们才会朝着可能获得答案的方向努力。

在您的情况下,我们首先检查日期是否相等,如果是,则意味着我们已经到了终点;否则,我们只是增加当前日期值(使用nextDay函数)并调用同一函数来检查差异在新日期和最终日期之间。

答案 1 :(得分:0)

这是尾部递归版本:

def daysBetweenDates(year1, month1, day1, year2, month2, day2):
    def helper(yearn, monthn, dayn, counter):
        if yearn==year2 and monthn==month2 and dayn==day2:
            return counter
        else:
            y, m, d = nextDay(yearn, monthn, dayn)
            return helper(y, m, d, counter + 1)
    return helper(year1, month1, day1, 0)

因此,基本上,助手的所有参数都是可以更改的变量,包括您需要的所有额外状态,例如counter。作为程序,执行此操作或while循环的工作原理完全相同,只有一个例外。

由于Python不执行尾调用优化,因此当日期之间间隔很长时,堆栈会崩溃。这是Python实现design decision done by Guido(作者),他提倡使用理解。在其他语言中,this和while循环的编译结果将无法区分。

在最流行的CPU架构(x86和Arm)中,您支持过程(无参数或返回值的函数),因此通过编写使用堆栈传递参数和返回值的代码来模拟带有参数的函数调用,因此关于如何做到的几个标准。 while循环也不存在,因此它是通过比较指令和分支指令(gotos)完成的,因此这两个功能实际上都不是CPU提供的功能,因此您可以说这些概念是可以使用的高级语言抽象。 TCO只是某些呼叫的更理想的实现。