我想尝试学习Lisp,但我很快就放弃了.我想我会再试一次.我正在关注Euler项目的问题2 - 找到所有甚至斐波那契数字低于4百万的总和.
我写了下面的代码,但有各种丑陋.其中最主要的是它太慢了 - 因为它一直在进行天真的递归.
当我用Python编写这个程序时,我按计算建立了一个列表,从不重新计算数字.我知道我可以在这里(不知何故)这样做,但这似乎不是真正的lisp精神,函数式编程.我在#3之后放弃了,当我达到递归深度限制并且不得不重写我的代码以使用循环而不是递归.
所以我想我的问题是:
这是我的代码:
(defun fib(i)
(if (= i 1) ;Could rewrite this as a case statement
1
(if (= i 2)
1
(+ (fib (- i 1)) (fib (- i 2))))))
(defun solve(i)
(let ((f (fib i))) ;Store result in local variable
(print f) ;For debugging
(if (< 4000000 f)
0 ;return
(if (= 0 (mod f 2))
(+ f (solve (+ i 1))) ;add number
(solve (+ …Run Code Online (Sandbox Code Playgroud) 在Excel中,我想舍入到最近的斐波纳契数.
我尝试了类似的东西(抱歉使用法语Excel):
RECHERCHEH(C7;FIBO;1;VRAI) -- HLOOKUP(C7, FIBO, 1, TRUE)
Run Code Online (Sandbox Code Playgroud)
其中FIBO是命名范围(0; 0,5; 1; 2; 3; 5; 8;等等)
我的问题是这个函数舍入到最小的数字而不是最近的数字.例如,12.8舍入为8而不是13.
注意:我只想使用excel公式,而不是VBA
所以,我已经看到了针对这个问题或类似问题的一些解决方案,但我真的想知道为什么 我的工作不起作用.它比我找到的很多解决方案更容易阅读,所以我很乐意让它发挥作用!
从1对兔子开始,2个月后开始繁殖.跑了n个月,兔子在生活了几个月后就死了.输入'6 3'应该返回4,但它返回3.
#run for n months, rabbits die after m months.
n, m = input("Enter months to run, and how many months rabbits live, separated by a space ").split()
n, m = int(n), int(m)
generations = [1, 1, 2] #Seed the sequence with the 1 pair, then in their reproductive month.
def fib(i, j):
count = 3 #we start at the 3rd generation.
while (count < i):
if (count < j):
generations.append(generations[count-2] + generations[count-1]) #recurrence relation before …Run Code Online (Sandbox Code Playgroud) 我在面试时得到了这个问题,不知道如何计算答案.
如果删除"LINE 3",fib(n)需要多少额外的函数调用?答案应该是n.
int fib(int n) {
if(n == 0) return 0;
if(n == 1) return 1;
if(n == 2) return 1; //LINE 3 HERE <---
return fib(n - 1) + fib(n - 2);
}
Run Code Online (Sandbox Code Playgroud) 我正在研究Tail调用递归,并且遇到了一些提到的文档.Sun Java没有实现尾调用优化.我写了以下代码以3种不同的方式计算斐波纳契数:1.迭代2.头递归3.尾递归
public class Fibonacci {
public static void main(String[] args) throws InterruptedException {
int n = Integer.parseInt(args[0]);
System.out.println("\n Value of n : " + n);
System.out.println("\n Using Iteration : ");
long l1 = System.nanoTime();
fibonacciIterative(n);
long l2 = System.nanoTime();
System.out.println("iterative time = " + (l2 - l1));
System.out.println(fibonacciIterative(n));
System.out.println("\n Using Tail recursion : ");
long l3 = System.nanoTime();
fibonacciTail(n);
long l4 = System.nanoTime();
System.out.println("Tail recursive time = " + (l4 - l3));
System.out.println(fibonacciTail(n));
System.out.println("\n Using Recursion : ");
long …Run Code Online (Sandbox Code Playgroud) 我们知道,每个非负十进制数可以用Fibonacci数的和来唯一表示(这里我们关注最小表示,即在数字的表示中没有连续的Fibonacci数,并且每个Fibonacci数最多只取一个在代表中).
例如:
1-> 1
2-> 10
3->100
4->101, here f1=1 , f2=2 and f(n)=f(n-1)+f(n-2);
Run Code Online (Sandbox Code Playgroud)
所以每个十进制数可以在Fibonacci系统中表示为二进制序列.如果我们在Fibonacci系统中连续写出所有自然数,我们将获得如下序列:110100101 ...这称为"自然数的斐波那契位序列".
我的任务是计算第1位出现在该序列的前N位中的次数.由于N可以取1到10 ^ 15的值,我可以不存储斐波纳契数列吗?
例如:如果N是5,答案是3.
我最近为了自己的娱乐而研究和测试各种Fibonacci算法,或多或少意外地提出了经典的O(n)时间和O(1)空间动态编程实现的替代实现.
考虑以下两个功能:
BigInt fib_dp_classic(int n) {
if (n == 0) {
return 0;
}
BigInt x = 0, y = 1, z;
for (int i = 2; i <= n; ++i) {
z = x + y;
x = y;
y = z;
}
return y;
}
Run Code Online (Sandbox Code Playgroud)
和
BigInt fib_dp_mod(int n) {
BigInt x = 0, y = 1, z = 1;
for (int i = 0; i < n; ++i) {
switch (i % 3) {
case 0:
y …Run Code Online (Sandbox Code Playgroud) 我一直在尝试在不使用惰性zipwith方法的情况下实现从 0 到 n 的斐波那契数列列表。到目前为止,我所拥有的是将列表从n1返回到 1 的代码。有什么方法可以更改此代码,以便它从 0- 返回列表n?
例子:
fib_seq 4 = [3,2,1,1]
-- output wanted: [1,1,2,3]
Run Code Online (Sandbox Code Playgroud)
如果没有办法做我想让代码做的事情,有没有办法只返回斐波那契数字列表,再输入一个数字,再说 4 它将返回[0, 1, 1, 2].
fib_seq :: Int -> [Int]
fib_seq 0 = [0]
fib_seq 1 = [1]
fib_seq n = sum (take 2 (fib_seq (n-1))) : fib_seq (n-1)
Run Code Online (Sandbox Code Playgroud) 基本上我需要帮助从我在Python中创建的列表中生成偶数:
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, ...]
Run Code Online (Sandbox Code Playgroud)
我尝试了几种不同的方法,但每次打印时,都有奇数混合在一起!
我知道如果我要做0-100的范围,如何生成偶数/奇数,但是,只获得前面提到的列表中的偶数数字让我难过!
PS我只使用python几天,如果事实证明非常简单,提前谢谢!
编辑:感谢所有的回复,在你的帮助下我已经解决了这个小问题.以下是我最终要完成的一些练习,要求总结偶数的斐波纳契数列:
F = [1, 2]
while F[-1] < 4000000
F.append(F[-1] + F[-2])
sum(F[1::3])
4613732
Run Code Online (Sandbox Code Playgroud) 我有一个Fibonacci可以用作任何一个迭代器实现结构One,Zero,Add和Clone.这适用于所有整数类型.
我想将这个结构用于BigInteger使用a实现Vec并且调用昂贵的类型clone().我想Add在两个引用上T使用然后返回一个新的T(然后没有克隆).
对于我的生活,我不能制作一个虽然编译的...
工作:
extern crate num;
use std::ops::Add;
use std::mem;
use num::traits::{One, Zero};
pub struct Fibonacci<T> {
curr: T,
next: T,
}
pub fn new<T: One + Zero>() -> Fibonacci<T> {
Fibonacci {
curr: T::zero(),
next: T::one(),
}
}
impl<'a, T: Clone + Add<T, Output = T>> Iterator for Fibonacci<T> {
type Item = T;
fn next(&mut …Run Code Online (Sandbox Code Playgroud)