计算机科学和编程导论-week3-递归

来源:互联网 发布:非主流 知乎 编辑:程序博客网 时间:2024/05/16 14:16

计算机科学和编程导论

 

Week3

递归

 

递归步骤

基线条件

 

def recurMul(a, b):

    if b == 1:#基线条件

        return a

    else:

        return a + recurMul(a, b-1)  #递归步骤

 

def recurPower(base, exp):

      if exp = 0 :#基线条件

        return 1

return base * recurPower(base,exp-1)  #递归步骤

————————————————————————

 

def recurPowerNew(base, exp):

if exp == 0:#基线条件

    return 1

elif exp % 2 == 0:

        return recurPowerNew(base*base, exp/2)#递归步骤

return base * recurPowerNew(base, exp-1)#递归步骤

————————————————————————

def gcdIter(a, b):#迭代

    gys = min(a,b)

    while a % gys != 0 or b % gys != 0:

        gys -= 1

return gys

————————————————————————

def gcdRecur(a, b):

    if b == 0:#基线条件

        return a

    return gcdRecur(b, a % b)#递归步骤

 

 

汉诺塔 - #思考

def printMove(fr, to):                     #输出语句

    print('move from ' + str(fr) + ' to ' + str(to))#移动步骤 fr > to

 

def Towers(n, fr, to, spare): #数量,起始,终点,空

    if n == 1:#基线条件

        printMove(fr, to)#输出语句

    else:

        Towers(n-1, fr, spare, to) #倒数第二个 起始>>终点

        Towers(1, fr, to, spare)#第一个 起始>终点>

        Towers(n-1, spare, to, fr)#倒数第二个 空>终点>起始

——————————————————

斐波纳契数

def fib(x):

    assert type(x) == int and x >= 0 #断言

    if x == 0 or x == 1:#基线条件

        return 1

    else:

        return fib(x-1) + fib(x-2)#递归步骤

assert 断言:声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。

————————————————————————————————

回文结构

def isPalindrome(s): #函数,内部函数调用

 

    def toChars(s):#函数

        s = s.lower()#定义所有字符为小写

        ans = ''

        for c in s:

            if c in 'abcdefghijklmnopqrstuvwxyz':

                ans = ans + c

        return ans#返回重新生成的字符串

 

    def isPal(s):

        if len(s) <= 1:#基线条件

            return True

        else:

            return s[0] == s[-1] and isPal(s[1:-1])#递归步骤

 

return isPal(toChars(s))

-------------------------------------------------------------------------

def lenIter(aStr):#迭代

    num = 0

    for c in aStr:

        num += 1

return num

---------------------------------

def lenRecur(aStr):

    if aStr[0:1] == '':#基线条件

        return 0

    else:

        return 1 + lenRecur(aStr[1:]) #递归步骤

 

————————————————————————

def isIn(char, aStr):

if char=='':#char为空

return True

if aStr=='':#aStr为空

return False

if char==aStr[len(aStr)/2]: #charaStr前半段

return True

if char<aStr[len(aStr)/2]:  #char长度小于aStr/2

return isIn(char,aStr[:len(aStr)/2])  #aSt/2r后半段重新开始

if char>aStr[len(aStr)/2]: #char长度大于aStr/2

return isIn(char,aStr[len(aStr)/2+1:])#aSt/2+1不断重新开始

————————————————————————

def semordnilap(str1, str2):#镜像

if len(str1) != len(str2):#判断长度

return False

elif len(str1) == 1:#判断长度是否为1

return str1 == str2

elif str1[0] == str2[-1]:#基线条件

return semordnilap(str1[1:],str2[:-1]) #递归步骤

else:

return False

 

全局变量

global

def fibMetered(x):

    global numCalls

    numCalls += 1

    if x == 0 or x == 1:

        return 1

    else:

        return fibMetered(x-1) + fibMetered(x-2)

 

 

def testFib(n):

    for i in range(n+1):

        global numCalls

        numCalls = 0

        print('fib of ' + str(i) + ' = ' + str(fibMetered(i)))

        print('fib called ' + str(numCalls) + ' times')

 

0 0
原创粉丝点击