python问题,跪求大神解答

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python问题,跪求大神解答相关的知识,希望对你有一定的参考价值。

书上的一个题,我知道答案,但是怎么用python写出来啊?求大神帮助
对乒乓球选手参加双打比赛,他们的球衣号码是1,2,…18.这时裁判惊喜地发现,每对选手的球衣号码之和都恰好是一个完全平方数,则求1号选手结对的是几号选手

#!/usr/bin/python
#encoding=utf-8
import sys

def get_candidates(n):
    ''' 返回小于n的所有完全平方数 '''
    ret = set()
    i = 2
    while (i*i <= n):
        ret.add(i*i)
        i += 1
    return ret

_table = []
def bt(paired_numbers, player_numbers, candidates):
    global _table
    for s in _table:
        if player_numbers == s:
            return
    _table.append(player_numbers)
    if len(paired_numbers) == 9:
        print "find solution"
        print paired_numbers
        sys.exit(0)
    for p1 in player_numbers:
        for p2 in player_numbers:
            if p1 >= p2:
                continue
            if (p1+p2) in candidates:
                new_player_numbers = player_numbers.copy()
                new_paired_numbers = paired_numbers.copy()
                new_player_numbers.remove(p1)
                new_player_numbers.remove(p2)
                new_paired_numbers.add((p1, p2))
                bt(new_paired_numbers, new_player_numbers, candidates)



if __name__ == "__main__":
    player_numbers = set()
    for n in range(1,19):
        player_numbers.add(n)
    # 获取最大可能的号码和
    candidates = get_candidates(18+17)
    bt(set(), player_numbers, candidates)

代码都写出来了,不至于看不懂吧,最后结果为
set([(3, 13), (6, 10), (7, 18), (1, 15), (9, 16), (4, 12), (8, 17), (5, 11), (2, 14)])

也就是说,1的对手是15

追问

大神,我可以问下这题的思路吗,我才学,有许多地方看不懂·········

追答

这属于一到算法题目,和语言本身无关,相关资料去查阅回溯算法,也就是所说的backtracking,核心思路就是bt那个函数,它从候选人中选取两个出来,看这两个p1+p2是否为一个完全平方数,如果是,就将这两个候选人数据加入到paired_numbers中,然后递归剩下的players。相当于一种计算机的暴力算法,执行可能的所有步骤,最终总会找到答案。去看算法书吧,比我这里讲的详细多了。

参考技术A from random import shuffle
ls = []#存储完全平方数
for i in range(10):
    if i*i <=18+17 and i*i >= 1+2:#完全平方数取值范围
        ls.append(i*i)
print '完全平方数: ' + str(ls)

players = []#存储选手号码
for i in range(1,19):
    players.append(i)
print '参赛选手: ' + str(players)

def jiance(l):
    c=0
    shuffle(l)
    for i in range(0,18,2):#九组组合
        if l[i] + l[i+1] in ls:
            c += 1
    if c == 9:
        print '可能的结果: ' + str(l)

if __name__ == '__main__':
    while 1:
        jiance(players)

基本思路就是总共有九组对手,我们假设一号位置和二号位置对打,三号位置和四号位置对打,以此类推,借用random函数,随机产生可能的排列组合情况,总有一组情况会满足题目要求,这种方法的弊端就是随机产生的排列效率低下。下面是一个结果,1号和15号对打。

完全平方数: [4, 9, 16, 25]
参赛选手: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
可能的结果: [17, 8, 2, 14, 6, 10, 5, 11, 16, 9, 12, 4, 7, 18, 13, 3, 1, 15]

本回答被提问者采纳

各位java大神,小弟跪求一个解决的方案:调用外部接口得到返回值--耗时问题

目前遇到的问题是这样的:我取出一个LIst集合,每一条数据构建成一个参数去调用一个外部接口,但是得到接口返回值需要耗时,比如10秒,要是List有上万条数据,那一次循环完得多少个小时了,求怎么解决啊 ,下面是我的伪代码:
For (int i =0;i<list.size();i++)

string returnstr = getResult();//调用外部接口得到返回值,这里可能耗时(比如10秒);
updateDate(returnstr).//根据返回值更新数据库的数据


这样下来得好长时间啊 ,用什么方式解决好呢,求给设计代码啊,小弟跪求,我的分数全给了,大神帮帮啊
用到的技术我也了解 ,关键是不知道怎么用,求代码啊 ,谢谢大侠了

参考技术A 不知道你用的什么语言编写的,但一定有获取系统时间的方法或函数吧?
java中可以这样
long start = Calendar.getInstance().getTime().getTime();
string returnstr = getResult();//调用外部接口得到返回值,这里可能耗时(比如10秒);

long end= Calendar.getInstance().getTime().getTime();
long time = end-start;//这里是毫秒数,根据自己需要转换一下吧

updateDate(returnstr).//根据返回值更新数据库的数据

先看看到底需要多长时间,话说是不是java实现的啊?追问

嗯,就是java实现,能给伪代码吗,谢了,用什么技术呢

追答

先写一个处理线程

package org.zcm.run;
public class MyRequestThread implements Runnable
//构造函数,传入请求路径或者参数,只要满足你的请求条件就行
private String param;
public MyRequestThread(String p)
param = p;


public void run()
String returnstr = getResult(param);//调用外部接口得到返回值,这里可能耗时(比如10秒);
updateDate(returnstr);//根据返回值更新数据库的数据

public String getResult(String param)
//这里写请求的方法,用connect或者client都可以
//这里如果请求比较复杂,或者要求比较严谨的话,建议用httpclient
String req = new String();
return req;

//这个方法要怎么实现你懂的
private void updateDate(String returnstr)
// TODO Auto-generated method stub




大概就是这样了。

然后循环调用
为了线程安全,可以用一些线程池来管理。
public class ListOperate

public static void main(String[] args)
//建立线程池
ExecutorService pool = Executors.newSingleThreadExecutor();
//测试数据
List params = new ArrayList();
params.add("1");
params.add("2");

for(String p:params)
Thread reqThread = new Thread(new MyRequestThread(p));
pool.execute(reqThread);

pool.shutdown();



还有别的线程池,用法查查就有了

参考技术B 多线程并发,使用线程池管理 参考技术C 必须使用多线程了 必须的

以上是关于python问题,跪求大神解答的主要内容,如果未能解决你的问题,请参考以下文章

跪求一道Python的题目解答!

为啥我的这段python代码运行不出来结果,也没报错,跪求大神指点

web config自定义节点报错 跪求大神完美解答

通过html页面的表单提交中文数据,Java后台出现乱码。跪求大神解答。

myeclipse 2014复制一个web项目后,项目首选项中没有web这个设置项,部署之后不能访问,跪求大神解答。

关于python编程决策树的问题,有没有大神来解答。。。