liyihao

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

备注:

#递归函数
#感觉这里不明白的是什么是递归函数

#看了一些教程,就是def 函数的过程中,def 函数名:   这个函数名你在下面的代码里用到了它的功能
#就是递归函数

def hanshu(n):
    return (n + hanshu(n))

#上面这个函数直接报了栈溢出
#还是用教程里面的阶乘吧

def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return (n * factorial(n - 1))

#在factorial 函数定义里面,return 里面用到了factorial ,所以这是一个递归函数
#递归函数调用的太多,就用出现栈溢出的现象
#解决方法是尾递归优化,尾递归和循环效果一致,循环是一种特殊的尾递归

#尾递归,函数返回的时候调用自身本身,并且,return语句不含表达式
#这样,就不会出现栈溢出的情况

#上面factorial 函数return 里面引入了乘法表达式,所以就不是尾递归

def fact(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    else:
        return fact_iter(num - 1, num * product)

#这段代码不太懂

#fact()函数先返回 fact_iter 这个函数
#下面的函数完成了阶乘的算法,return fact_iter(num-1, num*product) 仅返回递归函数本身,num-1 和num*product在函数调用前就会被计算,不会影响函数调用
#但是这段代码,在python idle里面执行还是会栈溢出



'''
练习
汉诺塔的移动可以用递归函数非常简单地实现。
请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,例如:
def move(n, a, b, c):
----
pass
----
# 期待输出:
# A --> C
# A --> B
# C --> B
# A --> C
# B --> A
# B --> C
# A --> C
move(3, 'A', 'B', 'C')
'''

def move(n, a, b, c):
    if n == 1:
        print (a, '——>', c)
    else:
        move(n-1, a,c,b)
        move(1, a,b,c)
        move(n-1, b,a,c)

#这段代码真是烧脑
#看了很多资料,终于有了理解的部分
'''
move(n-1, a,c,b)
n-1 是塔a 除了最后一层的 所有碟子
a,c,b  是将n-1 个碟子从a 通过c  搬到 b塔上,这里不用想到底是怎么搬的,就是把那n-1个碟子搬到b

move(1, a,b,c)
1  是塔 a 剩的最后一个碟子
a,b,c  是将塔a 最后剩的一个碟子,因为前面已经完成 n-1到 b,所以a 剩的最后一个 直接到c
也可以直接a 到c
print(a——>c)

move(n-1, b,a,c)
最后,就把b上面  的n-1 个碟子 通过a  搬到c上面
然后就完成搬运了
'''


'''
#再加一行参数检查吧
def move(n, a, b, c):
    if not isinstance(a, str):
        raise 'false type'
    if not isinstance(b, str):
        raise 'false type'
    if not isinstance(c, str):
        raise 'false type'
    if n == 1:
        print (a, '——>', c)
    else:
        move(n-1, a,c,b)
        move(1, a,b,c)
        move(n-1, b,a,c)
'''

#又报错,下次再说


move(4, 'A', 'B', 'C')
'''
A ——> B
A ——> C
B ——> C
A ——> B
C ——> A
C ——> B
A ——> B
A ——> C
B ——> C
B ——> A
C ——> A
B ——> C
A ——> B
A ——> C
B ——> C
'''

#递归函数里面到底是怎么计算的。。。。还是问题
#冬至了,快乐

  

posted on 2017-12-22 17:52  liyihao  阅读(228)  评论(0)    收藏  举报