Wolfram mathematica 在Mathematica中如何构造小于n的所有斐波那契数的列表

Wolfram mathematica 在Mathematica中如何构造小于n的所有斐波那契数的列表,wolfram-mathematica,Wolfram Mathematica,我想写一个Mathematica函数,它构造一个所有小于n的斐波那契数的列表。此外,我希望尽可能优雅地完成这项工作(因此不需要显式循环) 从概念上讲,我想得到一个自然数的无限列表,将Fib[n]映射到它上面,然后从这个列表中获取小于n的元素。在Mathematica中我怎样才能做到这一点呢?好的,我希望我理解了这个问题。但请注意,我不是纯数学专业的学生,我是机械工程专业的学生。但这听起来很有趣。所以我查了公式,这就是我现在能想到的。我必须运行,但如果有错误,请让我知道,我会修复它 此操作要求n,

我想写一个Mathematica函数,它构造一个所有小于n的斐波那契数的列表。此外,我希望尽可能优雅地完成这项工作(因此不需要显式循环)


从概念上讲,我想得到一个自然数的无限列表,将Fib[n]映射到它上面,然后从这个列表中获取小于n的元素。在Mathematica中我怎样才能做到这一点呢?

好的,我希望我理解了这个问题。但请注意,我不是纯数学专业的学生,我是机械工程专业的学生。但这听起来很有趣。所以我查了公式,这就是我现在能想到的。我必须运行,但如果有错误,请让我知道,我会修复它

此操作要求
n
,然后列出所有小于n的斐波那契数。没有循环可以找到少于
n
的斐波那契数的数量。它使用
Reduce
求解小于
n
的斐波那契数。我以结果为基础,也扔掉了一个常数,这个常数在解中是一个复数乘法器

然后用Mathematica
Fibonacci
命令简单地将所有这些数字组成一个表格。因此,如果输入
n=20
,它将列出
1,1,2,3,5,8,13,依此类推。我可以无限期地使用它,因为我的内存不足(我的电脑上只有8GB的ram)

我将
n
的限制设置为
500000
请随意编辑和更改代码

Manipulate[
 Module[{k, m}, 
  k = Floor@N[Assuming[Element[m, Integers] && m > 0, 
        Reduce[f[m] == n, m]][[2, 1, 2]] /. Complex[0, 2] -> 0];
  TableForm@Join[{{"#", "Fibonacci number" }}, 
    Table[{i, Fibonacci[i]}, {i, 1, k}]]
  ],

  {{n, 3, "n="}, 2, 500000, 1, Appearance -> "Labeled", ImageSize -> Small}, 
  SynchronousUpdating -> False, 
  ContentSize -> {200, 500}, Initialization :>
  {
   \[CurlyPhi][n_] := ((1 + Sqrt[5])/2)^n;
   \[Psi][n_] := -(1/\[CurlyPhi][n]);
   f[n_] := (\[CurlyPhi][n] - \[Psi][n])/Sqrt[5];
   }]

截屏


第一部分可以用Mathematica很容易地完成。下面,我提供了两个函数
nextFibonacci
,它提供了下一个大于输入数的Fibonacci数(就像
nexttime
)和
fibonacciList
,它提供了小于输入数的所有Fibonacci数的列表

ClearAll[nextFibonacci, fibonacciList]
nextFibonacci[m_] := Fibonacci[
    Block[{n}, 
        NArgMax[{n, 1/Sqrt[5] (GoldenRatio^n - (-1)^n GoldenRatio^-n) <= m, n ∈ Integers}, n]
    ] + 1
]
nextFibonacci[1] := 2;

fibonacciList[m_] := Fibonacci@
    Range[0, Block[{n}, 
      NArgMax[{n, 1/Sqrt[5] (GoldenRatio^n - (-1)^n GoldenRatio^-n) < m, n ∈ Integers}, n]
    ]
]
不过,第二部分很棘手。您正在寻找的是Haskell类型的惰性计算,它只在必要时进行计算(否则,您无法在内存中保存无限列表)。例如,类似(在Haskell中):

这样你就可以做

take 10 fibs
-- [0,1,1,2,3,5,8,13,21,34]

takeWhile (<100) fibs
-- [0,1,1,2,3,5,8,13,21,34,55,89]
撒10个小谎
-- [0,1,1,2,3,5,8,13,21,34]
takeWhile(如果您从GitHub获取my,您的解决方案非常简单:

Needs["Lazy`"]
LazySource[Fibonacci] ~TakeWhile~ ((# < 1000) &) // List
这包括一个
LazyList[]
表达式,其第一个元素是您正在惰性地计算的表达式的第一个值,第二个元素是关于如何继续展开的说明

改进 一直连续调用
Fibonacci[n]
效率有点低,尤其是
n
开始变大时。实际上,可以构造一个惰性生成器,在我们传输时计算Fibonacci序列的当前值:

Needs["Lazy`"]

LazyFibonacci[a_,b_]:=LazyList[a,LazyFibonacci[b,a+b]]
LazyFibonacci[]:=LazyFibonacci[1,1]

LazyFibonacci[] ~TakeWhile~ ((# < 1000)&) // List
可以使用它生成斐波那契序列,如下所示:

Needs["Lazy`"]
Fibonacci ~Map~ Lazy[Integers] ~TakeWhile~ ((# < 1000) &) // List
LazyGenerator[{1, 1}, {a_, b_} :> {b, a + b}, {a_, b_} :> a]

斐波那契数Fk的索引k为
k=Floor[Log[GoldenRatio,Fk]*Sqrt[5]+1/2]
, 因此,小于或等于n的斐波那契数列表为


你是否想要允许这样做?如果是这样,请考虑它。如果-这不是你要问的,请问一个实际的、具体的问题(现在在你的帖子里没有问题),然后张贴你自己编写的代码来尝试自己完成这一任务,我们可以帮助你处理那些代码中的具体问题。现在这是一个真正的问题(“我如何在Mathematica中做到这一点?”。投票赞成reopen@NasserM.Abbasi它似乎已重新打开。享受。@NasserM.Abbasi请确保您的保险账单是最新的,然后再尝试在任何地方存储无限列表。:)我懂了。现在帝国已经崛起,你决定躲在匿名的面纱后面。聪明,非常聪明。我只是一只没有名字的老鼠(马可能更好)。。。总有一天,我会永远逃离这个地方,寻找更好的奶酪。
LazyList[First[ 
  LazyList[Fibonacci[First[LazyList[1, LazySource[#1 &, 2]]]], 
   Fibonacci /@ Rest[LazyList[1, LazySource[#1 &, 2]]]]], 
 TakeWhile[
  Rest[LazyList[Fibonacci[First[LazyList[1, LazySource[#1 &, 2]]]], 
    Fibonacci /@ Rest[LazyList[1, LazySource[#1 &, 2]]]]], #1 < 
    1000 &]]
Needs["Lazy`"]

LazyFibonacci[a_,b_]:=LazyList[a,LazyFibonacci[b,a+b]]
LazyFibonacci[]:=LazyFibonacci[1,1]

LazyFibonacci[] ~TakeWhile~ ((# < 1000)&) // List
LazyGenerator[init_, step_, extract_] := 
 LazyList[Evaluate[init /. extract], 
  LazyGenerator[init /. step, step, extract]]
LazyGenerator[{1, 1}, {a_, b_} :> {b, a + b}, {a_, b_} :> a]
 FibList[n_Integer]:=Fibonacci[Range[Floor[Log[GoldenRatio,Sqrt[5]*n+1/2]]]]