《计算机科学导论》学习笔记(22) - 课程 22: 如何拥有无穷力量

1. 无穷力量

欢迎来到第 6 单元!

第 6 单元的笔记在这里:PDF

本单元介绍我认为所有计算中最迷人和最强大的思想——递归定义。理解它们需要一些思维的体操锻炼,但是一旦你理解了,你会发现优雅又强大的全新方式来思考你遇到的几乎所有问题。

本课程很快就会完成,但幸运的是,许多学生提供了大量的额外资源,比我在课程中更详细地解释事情,并提供更多的练习。

这里有一些我认为特别好:

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

(没怎么看明白,以后还要继续看!!)

29. 搜索引擎

猜你喜欢

转载自blog.csdn.net/qq_33528613/article/details/80601417
22
今日推荐