【问题标题】:How does this code calculate 4 to the power of <exponent>此代码如何计算 4 的 <exponent> 次方
【发布时间】:2020-01-25 10:06:47
【问题描述】:

我在 Coursera 上关注 Bioinformatics I。我的一位同学使用函数式编程解决了pattern_to_number 问题:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
from functools import reduce

def pattern_to_number(pattern):
    code = dict(zip("ACGT",range(4)))
    return reduce(lambda x,c: 4*x+code[c], pattern, 0)

print(pattern_to_number(sys.argv[1]))

这就是我在本地运行小程序的方式:

$ python3 ./pattern_to_number.py 'ATGCAA'

输出是(正确的):912

我了解lambdareduce 的使用。我不明白上面的功能解决方案如何能够模仿以下传统方法的功能。计算 4 的 i 次方。

for i, val in enumerate(pattern[::-1]):
        total += dict[val] * (4**i)

那么 lambda 的主体在哪里(或如何)计算 4 的 code[c] 的幂?

【问题讨论】:

    标签: python lambda functional-programming


    【解决方案1】:

    首先我们看一下reduce函数:

    reduce(lambda x,c: 4*x+code[c], pattern, 0)
    

    这会将当前值乘以4 并添加模式中的当前元素。写出来看起来像这样:

    1. x=0(初始值)c="A",结果为:4*x+code["A"] = code["A"]
    2. x=code["A"](上一个结果)c="C",结果是`4*x+code["C"] = 4*code["A"] + code["C"]
    3. x=4*code["A"] + code["C"]c="G",结果是4*x+code["G"] = 4*(4*code["A"] + code["C"]) + code["G"] = 4**2 * code["A"] + 4 * code["C"] + code["G"]
    4. x=4**2 * code["A"] + 4 * code["C"] + code["G"]c="T",结果是4*x+code["T"] = 4*(4**2 * code["A"] + 4 * code["C"] + code["G"]) + code["T"] = 4**3 * code["A"] + 4**2 * code["C"] + 4 * code["G"] + code["T"]

    对于每个序列元素,哪个具有4 的正确幂。

    所以诀窍在于reduce 函数的4*x,它最终将模式中的第一个元素乘以4 正好是len-1 倍,第二个元素乘以4 len-2 倍等等。

    【讨论】:

    • 感谢您抽出宝贵时间回答。使用基本构建块查看它令人耳目一新。
    • 我同学用的方法叫Horner's Method
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2020-04-01
    • 2011-04-23
    • 1970-01-01
    • 2020-02-02
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多