备注:
#递归函数
#感觉这里不明白的是什么是递归函数
#看了一些教程,就是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
'''
#递归函数里面到底是怎么计算的。。。。还是问题
#冬至了,快乐
浙公网安备 33010602011771号