哪种语言理解'变量a = 0,20,...,300'?

时间:2010-06-14 13:25:18

标签: list programming-languages arrays variables lazy-evaluation

哪种语言很聪明才能理解variable a = 0 , 20, ..., 300?所以你可以很容易地创建数组,它给出了步骤开始var last var(或者,更好的没有最后一个变量(一个无限数组))而不仅仅是数字(甚至是复数和自定义结构,如Sedenion's你会可能在你自己定义为一个类或其他什么......)

重点是,找到一种可用于某种语言的语言或算法,这种语言可以解释你给出的变量数组(或变量的参数)如何变化的规律。并使用该法律构成一个结构,您可以从中获得任何变量。

对每个人而言 - 您提供的示例对所有初学者都非常有帮助。同时也是构建这种“智能阵列”课程所需的基本知识。所以,非常感谢你的热心帮助。

作为JeffSahol noticed

  

所有可能的规则可能包括一些   这需要评估一些/所有   现有成员生成第n个   构件。

所以这是一个很难的问题。而且我认为能够“自然地”做到这一点的语言很适合玩耍,希望不仅仅是数学家。

20 个答案:

答案 0 :(得分:35)

Haskell中:

Prelude> let a=[0,20..300]
Prelude> a
[0,20,40,60,80,100,120,140,160,180,200,220,240,260,280,300]

btw:无限列表也是可能的:

Prelude> let a=[0,20..]
Prelude> take 20 a
[0,20,40,60,80,100,120,140,160,180,200,220,240,260,280,300,320,340,360,380]

答案 1 :(得分:20)

Excel中:

  • 在A1
  • 中写0
  • 在A2中写20
  • 选择A1:2
  • 向下拖动角落

答案 2 :(得分:12)

MatLab的:

a = [0:20:300]

答案 3 :(得分:10)

F#:

> let a = [|0..20..300|];;

val a : int [] =
  [|0; 20; 40; 60; 80; 100; 120; 140; 160; 180; 200; 220; 240; 260; 280; 300|]

复杂的数字:

let c1   = Complex.Create( 0.0, 0.0)
let c2   = Complex.Create(10.0, 10.0)
let a    = [|c1..c2|]

val a : Complex [] =
 [|0r+0i; 1r+0i; 2r+0i; 3r+0i; 4r+0i; 5r+0i; 6r+0i; 7r+0i; 8r+0i; 9r+0i; 10r+0i|]

正如你所看到的,它只增加了实部。

如果步骤也是一个复数,它将增加实部和虚部,直到达到last var实部:

let step = Complex.Create(2.0, 1.0)
let a    = [|c1..step..c2|]

val a: Complex [] =
  [|0r+0i; 2r+1i; 4r+2i; 6r+3i; 8r+4i; 10r+5i|]

请注意,如果此行为与您的需求不符,您仍然可以重载(..)(.. ..)运算符。例如。你想要它增加虚部而不是实部:

let (..) (c1:Complex) (c2:Complex) =
  seq {
    for i in 0..int(c2.i-c1.i) do
      yield Complex.Create(c1.r, c1.i + float i)
  }

let a    = [|c1..c2|]
val a : Complex [] =
 [|0r+0i; 0r+1i; 0r+2i; 0r+3i; 0r+4i; 0r+5i; 0r+6i; 0r+7i; 0r+8i; 0r+9i; 0r+10i|]

答案 4 :(得分:5)

稍后...

的Python:

print range(0, 320, 20)

给出

[0, 20, 40, 60, 80, 100, 120, 140, 160, 180, 200, 220, 240, 260, 280, 300]

支持评论(我知道有一种更简洁的方式:P)

答案 5 :(得分:5)

和PHP:

$a = range(1,300,20);

答案 6 :(得分:3)

的Scala:

scala> val a = 0 to 100 by 20
a: scala.collection.immutable.Range = Range(0, 20, 40, 60, 80, 100)

scala> a foreach println
0
20
40
60
80
100

无限名单:

scala> val b = Stream from 1     
b: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> b take 5 foreach println
1
2
3
4
5

答案 7 :(得分:2)

SWYM语言似乎不再在线,可以从几个示例项中推断出算术和几何进度,并生成一个合适的列表。

答案 8 :(得分:2)

Groovy中,

assert [ 1, *3..5, 7, *9..<12 ] == [1,3,4,5,7,9,10,11]

答案 9 :(得分:2)

和C ++一样[使用C ++库]:

// List is different from STL list
List<int> integers = enumFrom(1); // Lazy list of all numbers starting from 1

// filter and ptr_to_fun definitions provided by FC++
// The idea is to _filter_ prime numbers in this case
// prime is user provided routine that checks if a number is prime
// So the end result is a list of infinite primes :)
List<int> filtered_nums = filter( ptr_to_fun(&prime), integers );  

F C懒惰列表实现:http://www.cc.gatech.edu/~yannis/fc++/New/new_list_implementation.html

更多详情:http://www.cc.gatech.edu/~yannis/fc++/

Arpan

答案 10 :(得分:2)

在python中你有

a = xrange(start, stop, step)

(或简单地在python 3中的范围) 这为您提供了从开始到停止的迭代器。它可以是无限的,因为它是懒惰的。

>>> a = xrange(0, 300, 20)
>>> for item in a: print item
...
0
20
40
60
80
100
120
140
160
180
200
220
240
260
280

答案 11 :(得分:2)

我相信perl6中的语法是start ... *+increment_value, end

答案 12 :(得分:1)

你应该使用数学。

- (int) infiniteList: (int)x 
{
    return (x*20);
}

“智能”数组使用这种格式,因为我非常怀疑Haskel可以让你这样做:

a[1] = 15

定义a后。

答案 13 :(得分:1)

我可能误解了这个问题,但是指定编码你给出的具体例子的方法的答案(按20计算)并不真正满足数组“缓存”生成数组成员的任意规则的要求。 .it似乎几乎任何完整的解决方案都需要一个自定义集合类,它允许使用委派的函数/方法生成成员,特别是因为所有可能的规则可能包括一些需要评估一些/所有现有成员以生成第n个成员的规则。

答案 14 :(得分:1)

例如,C#实现了Enumerable.Range(int start, int count),PHP提供了函数range(mixed low, mixed high, number step),... 编程语言足够“智能”。

除此之外,无限阵列几乎没用 - 它根本不是无限的,而是全部耗费内存的。

由于没有给定数字的直接后继者或前任者,因此不能简单地使用复数进行枚举。 编辑:这并不意味着您无法比较复数或使用指定步骤创建数组!

答案 15 :(得分:1)

几乎任何程序语言都可以为您提供此序列。问题是您想用什么语法来表达它。例如,在C#中你可以写:

Enumerable.Range(0, 300).Where(x => (x % 20) == 0)

for (int i = 0; i < 300; i += 20) yield return i;

或封装在一个类中:

new ArithmaticSequence(0, 301, 20);

或静态类中的方法:

Enumerable2.ArithmaticSequence(0, 301, 20);

那么,你的标准是什么?

答案 16 :(得分:1)

大会: 假设edi包含所需数组的地址:

xor eax, eax
loop_location:
    mov [edi], eax
    add edi, #4
    add eax, #20
    cmp eax, #300
    jl loop_location

答案 17 :(得分:0)

MATLAB 它不是一种编程语言本身,而是一种工具,但你仍然可以像编程语言一样使用它。

它是为这样的数学运算而构建的,可以轻松地在阵列中轻松实现:)

a = 0:1:20;

创建一个从0到20的数组,增量为1。 而不是数字1,您还可以为增量提供任何值/操作

答案 18 :(得分:-1)

Php总是做得更简单,有时也很危险:)

答案 19 :(得分:-8)

嗯...... Java是我唯一认真使用的语言无法这样做(虽然我相信使用Vector而不是数组允许这样做。)