COMP9021 Principles of Programming WEEK11_Optional

Q1.

输入一串数字和一个目标值,求解不重复的使用这串数字中的数能够有多少种得到目标值的方法。
如使用12234求解目标值5,则:
1+2+2 = 5;
2+3 = 5;
2(另一个2)+3 = 5;
1+4 = 5
总共有4种方式。
思路:按顺序排查输入的这串数字,每一个数字都有两种情况:使用其形成目标数字,不使用其形成目标数字。使用recursion可以容易求解:

def solve(input_number, target_sum):
    if input_number == 0:
    #input_number为0就是判断到了这串数字的最后一个,所以属于base condition
        if target_sum == 0:
            return 1
        #如果target_sum等于0,说明之前选择的路径能够得到目标值,所以形成一个解,返回数字1代表一个解
        return 0
    if target_sum < 0:
        return 0
    #还会出现一些路径值求和大于了目标值,这样的情况不是解,不用继续向下展开,返回数字0代表无解
    return solve(input_number // 10, target_sum) + solve(input_number // 10, target_sum - input_number % 10)
    #对于每一位数字都有两种基本情况,使用/不使用这个数字作为求目标值的一部分

Q2.

同样的道理,把上题中求和得到目标值替换为求积得到目标值:

def solve(input_number, target_product):
    if input_number == 0:
        if target_product == 1:
            return 1
        return 0
    if target_product % (input_number % 10) == 0:
        return solve(input_number // 10, target_product) + solve(input_number // 10, target_product // (input_number % 10))
    else:
        return solve(input_number // 10, target_product)
    #与求和不同,任何数字都可以选择使用/不使用它来求和;但是乘积要先判断能不能整除,如果不能整除就一定不能使用

Q3.

在Q1的基础上继续变形,把返回具体的解法数量,换成由哪些解组成的。

def solve(input_number, target_sum):
    if input_number == 0:
        if target_sum == 0:
            return [[]]
        #如果有解,则返回一个嵌套的list结构,在内层可以生成之前路径使用的数字
        return []
        #如果无解,则返回一个不嵌套的list,无法在内层list生成解
    if target_sum < 0:
        return []
    return solve(input_number // 10, target_sum) + \
    [[input_number % 10] + sol for sol in solve(input_number // 10, target_sum - input_number % 10)]
    #这条语句不容易理解,核心是两个加号,这两个加号的共同点为二者都是list的连接符;
    #不同点是,第一个加号是不同解之间的list连接,第二个加号是形成解过程的list连接
    #换句话说,第一个加号连接的是外层的list element,第二个加号连接的内层的list element

print(solve(12345, 5))
>>>
[[2, 2, 1], [3, 2], [3, 2], [4, 1]]

Q4.

在Q3的基础上,去除重复的解。

def solve_without_duplication(input_number, target_sum):
    solutions = []
    for sol in solve(input_number, target_sum):
        sorted_sol = sorted(sol)
        if sorted_sol not in solutions:
            solutions.append(sorted_sol)
    return solutions

这段程序的操作比较简单,没有注释。

Q5.

继续在Q1的基础上变形,输入一串字母,找到其中增长的字母串的最大长度,允许不连续。比如'aceh',它的最大增长长度就是4;'caeh',它的最大增长长度就是3(aeh)。

def longest_increasing_sequence(w):
    for target_length in range(len(w), 0, -1):
        n = nb_of_sol(w, target_length, 0, chr(ord('a') - 1))
        if n:
            return target_length
    #因为要找最大程度,所以逆序去找,最大可能是word的长度,最短是1,这就有了上面的for循环
    #使用nb_of_sol根据输入的word,指定的长度,index和最后一个character寻找符合要求的解,有解救返回这个targe_length值
    #使用比ord('a')小1作为最后一个字母的初始值,保证任意一个字母都可以作为第一个开头字母使用

def nb_of_sol(w, desired_length, index, last_char):
    if desigred_length == 0:
        return 1
    if index >= len(w):
        return 0
    if w[index] > last_char:
        return nb_of_sol(w, desired_length - 1, index + 1, w[index]) +\
        nb_of_sol(w, desired_length, index + 1, last_char)
        #也是分成是否使用该字母构建目标值,不管是否使用index都要加1,和之前输入数字串要//10是一个道理
        #如果使用这个字母,则length要减1,同时最后的字母变成当前最后一个字母,方便判断后续字母是否比这个大
    else: 
        return nb_of_sol(w, desired_length, index + 1, last_char)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,373评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 前面的文章主要从理论的角度介绍了自然语言人机对话系统所可能涉及到的多个领域的经典模型和基础知识。这篇文章,甚至之后...
    我偏笑_NSNirvana阅读 13,887评论 2 64
  • 那刻,我才明白,实现经济独立才是解决所有问题的途径。 减肥,二口,雅思,看书,吉他 ...
    杨菇凉Joyce阅读 146评论 0 0
  • 佛手身份概括 佛手:属于武夷山外来引进品种,原产地为泉州永春,叶形非常大还厚,在武夷山岩茶品种中属于最大的叶片之一...
    f6afe8fe24a5阅读 310评论 0 0