1. 无穷力量
欢迎来到第 6 单元!
第 6 单元的笔记在这里:PDF。
本单元介绍我认为所有计算中最迷人和最强大的思想——递归定义。理解它们需要一些思维的体操锻炼,但是一旦你理解了,你会发现优雅又强大的全新方式来思考你遇到的几乎所有问题。
本课程很快就会完成,但幸运的是,许多学生提供了大量的额外资源,比我在课程中更详细地解释事情,并提供更多的练习。
这里有一些我认为特别好:
- 解释递归的另一种尝试 by Goldsong
- 理解递归:堆栈模型 by Charles Lin
- StG 的递归集合 by Sam the Great
2. 练习:长词
3. Counter
4. 练习:Counter 练习
5. 练习:扩展语法
6. 递归定义
7. 练习:先祖
8. 递归过程
9. 练习:递归阶乘
10. 练习:回文
题目:
# Define a procedure is_palindrome, that takes as input a string, and returns a
# Boolean indicating if the input string is a palindrome.
# Base Case: '' => True
# Recursive Case: if first and last characters don't match => False
# if they do match, is the middle a palindrome?
def is_palindrome(s):
#print is_palindrome('')
#>>> True
#print is_palindrome('abab')
#>>> False
#print is_palindrome('abba')
#>>> True
我的答案:
def is_palindrome(s):
"""
if len(s) <= 1:
return True
else:
return s[0] == s[-1] and is_palindrome(s[1: -1])
"""
return True if len(s) <= 1 else s[0] == s[-1] and is_palindrome(s[1: -1])
(众所周知,写递归的函数,需要 1 个基本情况,作为终止。还需要 1 个递归情况。
关于回文字符串的判断,基本情况是,为 1 个字符或空字符 ''
,即 len(s) <= 1
的情况。
对于递归的情况,可以这样判断:先判断首尾的字符是否相同,即 s[0] == s[-1]
,然后判断除去首尾字符以外的字符,即 is_palindrome(s[1:-1])
。)
Dave 的答案:
def is_palindrome(s):
if s == '':
return True
else:
if s[0] == s[-1]:
return is_palindrome(s[1:-1])
else:
return False
11. 递归 Vs 迭代
(回文字符串的非递归实现)
def iter_palindrome(s):
for i in range(0, len(s) / 2):
if s[i] != s[-(i+1)]:
return False
return True
(请注意 for
循环里面的 if
语句的判断, s[i] != s[-(i+1)]
比较的是从外往内遍历、首尾字符是否相等,如果不相等则立即返回 False
。如果遍历到了中间,仍然没有返回 False
,这时会退出循环,即整个字符串就是回文字符串。
这里,也隐含了对于空字符串和单个字符的判断,如果是这两种情况,不会进入循环,会直接返回 True
。)
12. 练习:兔子
题目:
# Define a procedure, fibonacci, that takes a natural number as its input, and
# returns the value of that fibonacci number.
# Two Base Cases:
# fibonacci(0) => 0
# fibonacci(1) => 1
# Recursive Case:
# n > 1 : fibonacci(n) => fibonacci(n-1) + fibonacci(n-2)
def fibonacci(n):
#print fibonacci(0)
#>>> 0
#print fibonacci(1)
#>>> 1
#print fibonacci(15)
#>>> 610
我的答案:
def fibonacci(n):
if n == 0: return 0
elif n == 1:return 1
else: return fibonacci(n-2) + fibonacci(n-1)
Dave 的答案:
def fibonacci(n):
if n == 0:
return 0
if n == 1:
return 1
return fibonacci(n-2) + fibonacci(n-1)
13. 分裂和被征服
14. 练习:调用计数
15. 练习:更快的 Fibonacci
题目:
#Define a faster fibonacci procedure that will enable us to computer
#fibonacci(36).
def fibonacci(n):
#print fibonacci(36)
#>>> 14930352
我的答案:
def fibonacci(n):
index_of_first = 1
first = 0
second = 1
while index_of_first <= n:
first, second = second, first+second
index_of_first += 1
return first
Dave 的答案:
def fibnacci(n):
current = 0
after = 1
for i in range(0, n):
current, after = after, current + after
return current
16. 网页排名
(没怎么看明白,以后还要继续看!!)
17. 人气
(没怎么看明白,以后还要继续看!!)
18. 练习:好定义
(没怎么看明白,以后还要继续看!!)
19. 练习:循环定义
(没怎么看明白,以后还要继续看!!)
20. 练习:放松
(没怎么看明白,以后还要继续看!!)
21. 网页排行
(没怎么看明白,以后还要继续看!!)
22. 练习:Altavista
(没怎么看明白,以后还要继续看!!)
23. Urank
(没怎么看明白,以后还要继续看!!)
24. 练习:实现 Urank
(没怎么看明白,以后还要继续看!!)
25. 计算网页排名
(没怎么看明白,以后还要继续看!!)
26. 正式计算
(没怎么看明白,以后还要继续看!!)
27. 计算排行
(没怎么看明白,以后还要继续看!!)
28. 练习:完成 Urank
(没怎么看明白,以后还要继续看!!)