怎么简洁的编出序列 1/5, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5

g
gooog
楼主 (北美华人网)
怎么简洁的编出序列 1/5, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5?
前5个数容易 后5个数容易 但是怎么能简洁造出整个序列呢?
x
xiaxie8
怎么简洁的编出序列 1/5, 1/4, 1/3, 1/2, 1, 2, 3, 4, 5?
前5个数容易 后5个数容易 但是怎么能简洁造出整个序列呢?
gooog 发表于 2023-05-10 21:26

您这个题目是典型的UIUC CS Algorithms的牛角尖题目。
不过本虾曾经是湖北省高中数学竞赛一等奖,能够对付。
设想n=1, 2, ..., 9
An=(|5-n|+1)^(2*floor((n-5)/5)+1)
Java code:
// Sequence.java public class Sequence {   public static void main(String[] args) {    for(int i = 1; i<=9; i++)      System.out.println(Math.pow(Math.abs(i-5)+1,2*Math.floor((i-5)/5.0)+1));        }  }
Python3 code:
#sequence.py import math
for i in range(1,10):   print(pow(abs(i-5)+1,2*math.floor((i-5)/5)+1))
g
gooog
您这个题目是典型的UIUC CS Algorithms的牛角尖题目。
不过本虾曾经是湖北省高中数学竞赛一等奖,能够对付。
设想n=1, 2, ..., 9
An=(|5-n|+1)^(2*floor((n-5)/5)+1)
Java code:
// Sequence.java public class Sequence {   public static void main(String[] args) {    for(int i = 1; i<=9; i++)      System.out.println(Math.pow(Math.abs(i-5)+1,2*Math.floor((i-5)/5.0)+1));        }  }
Python3 code:
#sequence.py import math
for i in range(1,10):   print(pow(abs(i-5)+1,2*math.floor((i-5)/5)+1))
xiaxie8 发表于 2023-05-10 23:08

您太牛了!
x
xiaxie8
您太牛了!
gooog 发表于 2023-05-10 23:25

Java和Python只是我掌握的10几种编程语言中的2种。
我从1984年就开始学计算机编程了。
r
riple
从中间的1往两边扩展,1就是1/1,左边的是分母加一,右边的是分子加一。
x
xiaxie8
从中间的1往两边扩展,1就是1/1,左边的是分母加一,右边的是分子加一。
riple 发表于 2023-05-11 00:04

您发现的规则当然很好,但是也必须写成piece-wise function。
我最开始是用8th-degree polynomial finite difference method解这道题:12/60, 15/60, 20/60, 30/60, 60/60, 120/60, 180/60, 240/60, 300/60
发现对于{12, 15, 20, 30, 60, 120, 180, 240, 300}数据拟合无法得到精确解。于是我意识到这个题目不是代数题,而是计算机算法题。
大家熟悉regular expression的应该可以找到更简洁的解答。
o
oqo
Java和Python只是我掌握的10几种编程语言中的2种。
我从1984年就开始学计算机编程了。
xiaxie8 发表于 2023-05-10 23:31

Apple II上码Basic?
x
xiaxie8
Apple II上码Basic?
oqo 发表于 2023-05-11 00:13

是的。当时我们武汉二中从美国买了大约20台原装苹果2,绿色单显,放空调房,老师和学生都穿白大褂。
O
OrangeKitten
用fortran可以這麼寫
program main implicit none real(8) :: a(-4:4) integer :: i do i=-4,4 a(i)=dble(abs(i)+1)**sign(1,i) end do write(*,*) "The sequence is ", a end
x
xiaxie8
用fortran可以這麼寫
program main implicit none real(8) :: a(-4:4) integer :: i do i=-4,4 a(i)=dble(abs(i)+1)**sign(1,i) end do write(*,*) "The sequence is ", a end
OrangeKitten 发表于 2023-05-11 00:39

您的Fortran比我的Java/Python3牛!
您只要把-4,4改成-5,5就能打印1/6, 1/5, ..., 5, 6
sign(1, i)好强大!数学计算Fortran is the king!
我只会Fortran77,请问现在是否应该学习Fortran90或以上?
m
meonline
For loop n If n<=5 then 1/(6-n) else n-4 不行吗 多一个if else 好读多了
x
xiaxie8
For loop n If n<=5 then 1/(6-n) else n-4 不行吗 多一个if else 好读多了
meonline 发表于 2023-05-11 00:54

当然您的程序可读性更强。
因为我在6楼已经证明了本题不可能有非阶段函数的简单解,所以需要if-else。
我现在正在构想Prolog的递归函数解,但是我50多岁了,一时完成不了。
O
OrangeKitten
您的Fortran比我的Java/Python3牛!
您只要把-4,4改成-5,5就能打印1/6, 1/5, ..., 5, 6
sign(1, i)好强大!数学计算Fortran is the king!
我只会Fortran77,请问现在是否应该学习Fortran90或以上?
xiaxie8 发表于 2023-05-11 00:48

我是高能物理背景,在這個領域裡,大部分的code都是用Fortran77寫的。Fortran90跟77是兼容的。所以就計算而言,77就夠了。
x
xiaxie8
我是高能物理背景,在這個領域裡,大部分的code都是用Fortran77寫的。Fortran90跟77是兼容的。所以就計算而言,77就夠了。
OrangeKitten 发表于 2023-05-11 01:13

多谢您的帮助!
sign(1,i)在77就有了。我刚刚复习了一下77。
晚安!
r
riple
这还不好写吗?java的: double[] createSeq(int len) {   double a = 1;   double[] array = new double[len];   for (int l=len/2, r=len/2; l>-1 && r<len; --l, ++r) {    array[l] = 1/a;    array[r] = a++;   }   return array; }
o
oqo
是的。当时我们武汉二中从美国买了大约20台原装苹果2,绿色单显,放空调房,老师和学生都穿白大褂。
xiaxie8 发表于 2023-05-11 00:17

还得穿拖鞋 窗帘整天拉上 搞的神秘兮兮的?
m
miamivivian
还得穿拖鞋 窗帘整天拉上 搞的神秘兮兮的?
oqo 发表于 2023-05-11 02:22

哈哈 想到我小学时 学校的计算机房就是这样的 那时候我们学的是basic语言 现在都记不清了 只记得有go to语句 后来大学学c和java才发现go to早就被淘汰了 太乱了容易出错:)
x
xiaxie8
还得穿拖鞋 窗帘整天拉上 搞的神秘兮兮的?
oqo 发表于 2023-05-11 02:22

是的配了20双拖鞋,窗帘永远拉上。
当时的计算机老师很有钱,1984年他自己就有日本生产的小型彩色摄录一体机,接到苹果单色显示器只能显示绿色和白色,他不满意,就把他自己那台苹果单色显示器换成了苹果彩色显示器,然后我们编BASIC,他就剪切视频自己玩。
x
xiaxie8
哈哈 想到我小学时 学校的计算机房就是这样的 那时候我们学的是basic语言 现在都记不清了 只记得有go to语句 后来大学学c和java才发现go to早就被淘汰了 太乱了容易出错:)
miamivivian 发表于 2023-05-11 05:22

记得BASIC有行号,10, 20, 30,如果在10后面加一句,一般就用新行号11。
记得FORTRAN77也可以用行号。
都是为了go to方便。
这种编程风格影响了我后来学Java,所以我写Java必然有很多break label;
x
xiaxie8
回复 12楼xiaxie8的帖子
昨天晚上试了一下Prolog的递归解,试了20分钟,程序有点小bug,方括号[ ]太多,尝试用flatten函数也不work,但总体目的达到了。
% sequence.pl
sequence(1,[1]). sequence(I, [1/I, L, I]) :- I > 1, I1 is I - 1, sequence(I1, L).
/* sample run sequence(1,L) L = [1] sequence(4,L) L = [1/4, [1/3, [1/2, [1], 2], 3], 4] */
我在爱荷华学的Prolog基本上都还给老师了。我现在模糊地感觉,它list的head是1个element,而tail是1个list,我可以用head recursion,也可以用tail recursion,但是似乎不能同时用head recursion和tail recursion,所以我的多余方括号问题似乎无解。今晚有空复习一下LISP, Miranda, Haskell,Java lambda,看看有没有更好的解决办法。
o
oqo
哈哈 想到我小学时 学校的计算机房就是这样的 那时候我们学的是basic语言 现在都记不清了 只记得有go to语句 后来大学学c和java才发现go to早就被淘汰了 太乱了容易出错:)
miamivivian 发表于 2023-05-11 05:22

go to方便快捷但不可靠 就像笔记本电脑里面的飞线
m
miavita
炸出一堆og 学霸
x
xiaxie8
炸出一堆og 学霸
miavita 发表于 2023-05-11 13:36

我知道学霸,但og是什么?
谢谢!
x
xiaxie8
go to方便快捷但不可靠 就像笔记本电脑里面的飞线
oqo 发表于 2023-05-11 13:29

我拆过几台笔记本,但未发现飞线。
o
oqo
我拆过几台笔记本,但未发现飞线。
xiaxie8 发表于 2023-05-11 21:58

联想Thinkpad干过 好像是T60
x
xiaxie8
联想Thinkpad干过 好像是T60
oqo 发表于 2023-05-12 01:10

T60似乎是十几年前的型号了。
今天的笔记本似乎主板都是专门设计的,每一个接口都和外壳匹配非常好,根本就不需要飞线了。
o
oqo
T60似乎是十几年前的型号了。
今天的笔记本似乎主板都是专门设计的,每一个接口都和外壳匹配非常好,根本就不需要飞线了。
xiaxie8 发表于 2023-05-12 01:14

那是,技术先进了太多了 硬件也便宜 以前设计出问题 可舍不得扔掉那么多板子 不过集成度太高也不好 内存焊在主板上 屏幕粘在边框上 电池耶焊在板子上 维修成本过高 甚至不能维修
x
xiaxie8
那是,技术先进了太多了 硬件也便宜 以前设计出问题 可舍不得扔掉那么多板子 不过集成度太高也不好 内存焊在主板上 屏幕粘在边框上 电池耶焊在板子上 维修成本过高 甚至不能维修

oqo 发表于 2023-05-12 01:25

今天的轻薄笔记本,基本上是既不能升级,也不能维修。