欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 算法 小试牛刀

程序员文章站 2022-03-11 11:20:04
...

 

1.打印从1到100,碰到3倍数用fizz代替,碰到5倍数,用buzz代替,3和5的倍数,FizzBuzz代替

def func():
    for i in range(1,101):
        if i % 3 == 0 & i % 5 == 0
           print("FizzBuzz")
        elif i % 3 == 0:
            print("fizz")
        elif i % 5 == 0:
            print("buzz")
        else:
            print(i)

func()

 

2. 顺序(搜索)算法

顺序搜索是一个简单的搜索算法。搜索牌堆中的一张特定牌,有就停止;没有,搜索完也停止

def funz(number_list,n):
    found = False
    for i in number_list:
        if  i == n:
            found = True
            break
    return found

'''
#以数字为例
numbers = range(0,100)
ss = funz(numbers,3)
print(ss)
sss = funz(numbers,201)
print(sss)
'''
    

用found记录是否找到。找到就设置为true,退出循环,并返回found变量;没有找到,就继续搜索下一张牌,如果遍历完所有的牌,返回变量found。通过found的值判断是否找到该牌。

 

3. 回文词(palindrome)

逆序和正序写出的单词是相同的词,大小写视为同一个单词。如何判断是否为回文词:

def palindrome(word):
    word = word.lower()
    return word[::-1] == word

print(palindrome("Morde"))
print(palindrome("Mom"))

[::-1]是python中逆序返回可迭代对象的切片的语法。

 

4.变位词(anagram)

通过重组另一个单词的字母组成的单词。iceman 是cinema的一个变位词。如何判断是否为变位词:

def funa(word1,word2):
    w1 = word1.lower()
    w2 = word2.lower()
    return sorted(w1) == sorted(w2)


print(funa("iceman","cinema"))
print(funa("lead","wolf")

避免大小写影响算法结果,对单词使用lower方法。判断单词是否一样,只需要进行排序,排序后的结果相同,则返回True,否则返回False。(sorted方法会返回一个以字母顺序排序的结果。)

 

5.计算字母频数

判断单词中每个字母出现的次数:

def funv(string):
    dict = {}
    for c in string:
        if c in dict:
            dict[c] += 1
        else:
            dict[c] = 1
    print(dict)
  

'''
#为了更直观的了解代码,可以用下面的代码
def funv(string):
    dict = {}
    for c in string:
        if c in dict:
            dict[c] += 1
            print(dict)
        else:
            dict[c] = 1
    print("&&&&&&&")
    print(dict)

print(funv("sftinigddd"))
'''

遍历参数string的每个字母,如果字母存在字典dict中,将对应的值递增1;不在的话,添加到字典dict中,并将对应值置为1.for循环结束后,dict将包含字符串每个字母的键值对。每个键的值就是字符串中该字母所出现的次数。

 

6.递归

recursion是将问题不断切分成更小的问题。直到小问题可以轻松解决的一种方法。

       迭代式算法:使用循环不断重复一个步骤来解决问题。

       递归式算法:通过调用自身函数来实现。

任何可以迭代式解决的问题,都可以递归式地解决。

       递归算法,必须要有一个终止条件(base case),每次调用自己的时候,会离终止条件越来越近。最终满足终止条件,此时问题得到解决,函数停止调用自己。故三个条件:a.递归算法必须有终止条件;b.递归算法必须改变自己的状态,不断靠近终止条件;c.递归算法必须递归地不断调用自己。

def bottles(bob):
    """Prints 99 Bottle
       of Beer on the
       Wall lyrics.
       :param bob:Must
       be a positive
       integer.
    """
    if bob < 1:
        print("""No more
                 bottles
                 of beer
                 on the wall.
                 more
                 bottles of
                 beer.""")
        return 
    tmp = bob
    bob -= 1
    print("""{} bottles of
             beer on the
             wall. {} bottles
             of beer. Take one
             down, pass it
             around, {} bottles
             of beer on the
             wall.
             """.format(tmp,
                        tmp,
                        bob))
    bottles(bob)

(a)  递归的第一个原则通过如下终止条件满足:

if bob < 1:
        print("""No more
                 bottles
                 of beer
                 on the wall.
                 more
                 bottles of
                 beer.""")
        return 

(b)  bob -= 1 满足了递归的第二个原则,因为递减变量bob 的值将使其不断接近终止条件。变量bob 的值小于1 时,满足终止条件,函数每调用一次自身,就离终止条件更近一步。
(c)  递归的最后一个原则也满足了:

bottles(bob)