链的节点中的每个值是根据先前值加上前一个值的数字之和计算的

时间:2017-02-02 13:09:27

标签: python python-3.x linked-list nodes

我对这类事情很陌生,并试图找到如何计算出一个带有两个整数值的函数,起始值和总共有多少节点应该在链中。节点链中的每个值都是根据先前值加上前一个值的数字之和计算得出的。例如:

(409, 5)

将生成

409
422
430
437
451

我的代码现在:

class Node:
    def __init__(self, init_data):
        self.data = init_data
        self.next = None

    def get_data(self):
        return self.data

    def get_next(self):
        return self.next

    def set_data(self, new_data):
        self.data = new_data

    def set_next(self, new_next):
        self.next = new_next

    def __str__(self):
        return str(self.data)

def generate_chain(start, n):
    node = Node(start)
    current = start
    string_of_nodes = str(start)
    list_of_nodes = []
    print(current)
    for digit in string_of_nodes:
        list_of_nodes.append(int(digit))
    for i in range(n-1):
        node.set_next(sum (int(a) for a in list_of_nodes) + int(current))
        current += (node.get_data())
        print(current)

生成输出:

409
818
1227
1636
2045
2454

我想知道是否有人可以帮助我找到错误并以正确的方式指导我。谢谢。

3 个答案:

答案 0 :(得分:1)

这可以很好地实现为我认为的生成器:

def chain(steps, value):
    for i in range(steps):
        yield value
        value+=sum([int(i) for i in str(value)])

x = chain(5, 409)
for i in x:
    print(i)

如果要使用Node类,可以使用此功能:

def generate_chain(start, n):
    node = Node(start)
    for k in range(n):
        yield node.get_data()
        node.set_next(node.get_data() + sum(int(i) for i in str(node)))
        node.set_data(node.get_next())
        value = node.get_data()

I = generate_chain(409, 5)
for i in I:
    print(i)

答案 1 :(得分:1)

使用Node类的替代实现可以是:

def generate_chain(start, n):
    head = node = Node(start)
    for _ in range(n):
        sum_of_digits = 0
        v = node.get_data()
        while v > 0:
            sum_of_digits += v % 10
            v //= 10

        node.set_next(Node(node.get_data() + sum_of_digits))
        node = node.get_next()

    node = head
    while node:
        print(node.get_data())
        node = node.get_next()

此代码创建一个节点链然后打印。原始代码中的问题似乎是由于set_next使用int而不是Node调用,因此未正确构建链。

答案 2 :(得分:1)

使用s.append(x)函数和算术模运算符%的简短解决方案:

def generate_chain(num, total):
    chain = [num]  # setting the initial value
    total -= 1
    while total:
        chain.append(chain[-1] + chain[-1] // 100 + chain[-1] // 10 % 10 + chain[-1] % 10)
        total -= 1
    return chain

print(generate_chain(409, 5))

输出:

[409, 422, 430, 437, 451]