LINUX.ORG.RU
ФорумTalks

Простенькая задачка программистам


0

4

Задача: написать функцию для расчёта n-го числа Фибоначчи в одно выражение и без явного использования рекурсии. Желательно также уместить в одну строку. Мною получена применительно к Scala, но вы пишите на любом языке. Да, и ещё, это должен быть расчёт числа с использованием двух предыдущих, формулу для вычисления n-го числа сразу использовать нельзя.

★★★

Опиши более строго. Ну сделаю я цикл, тоже по идее одно выражение. Ты имел ввиду набор каких то последовательных трансформаций списков или последовательностей?

vertexua ★★★★★
()
Ответ на: комментарий от Zhbert

Развлечь себя, зачем ещё нужны маленькие простенькие задачки?

Zenom ★★★
() автор топика

Простенькая задача врачам

Удалите гланды через задницу, одним инструментом, и без явного использования наркоза. Ах да, и еще инструмент нужно собирать внутри больного, готовый запихивать в задницу нельзя.

amomymous ★★★
()

дык массив плюс цыкл:

for (i = 0; i < N ; i++) { a = a[i-1] + a[i-2]; }; return a[N];

утаптывать в одно выражение лениво, но вполне возможно

gods-little-toy ★★★
()
Ответ на: комментарий от vertexua

Это значит, что можно использовать библиотечные функции, которые могут быть реализованы рекурсивно. Баян с zip-ом списка подходит под условие.

Zenom ★★★
() автор топика
Ответ на: комментарий от vertexua

For comprehension не является циклом в общепринятом понимании этого термина.

Zenom ★★★
() автор топика
Ответ на: комментарий от Zenom
import scala.math.BigInt
lazy val fibs: Stream[BigInt] = BigInt(0) #::
                                BigInt(1) #::
                                fibs.zip(fibs.tail).map { n => n._1 + n._2 }

Из инетов. Я на авторство не претендую, так как просто знаю решение, но провозился бы время чтобы его соорудить.

Тут рекурсия похоже не подходит под условие?

vertexua ★★★★★
()
Ответ на: комментарий от gods-little-toy

то есть (мало того, что а - вроде как массив) в первом проходе выходит a = a[-1] + a[-2]

TheAnonymous ★★★★★
()
Ответ на: комментарий от vertexua

Да, это не подходит из-за рекурсии.

Zenom ★★★
() автор топика
Ответ на: комментарий от Zenom

>Цикл — это не выражение.

Что по-твоему «в одно выражение»? В си очень мало работы происходит именно в «выражениях» - ты хочешь «опустить» си?

yyk ★★★★★
()
Ответ на: комментарий от yyk

И развести лиспосрач. Чёрт, меня раскусили!

Zenom ★★★
() автор топика
def fib(n): return reduce(lambda x, y: (x[1], x[0]+x[1]), xrange(n), [0, 1])[0]
baverman ★★★
()

Вау, какая полезная задача.

Мною получена применительно к Scala

Аа. Ну понятно.

thesis ★★★★★
()
Ответ на: комментарий от mi_estas

> ну в одну стоку же!

Да, у меня тоже ужоснах вчера получился.

Zenom ★★★
() автор топика

Быдлокода горстку НА!

function phib($n){
    for($q=array(0,1),$i=1;$i>-1;$i++)if($i<$n)$q[] = array_sum(array_slice($q,count($q)-2,2));else return $q[count($q)-1];
}

p.s. сначала хотел на перле, но потом подумал что на пыхе - дело принципа

r_asian ★☆☆
()

Честно - АТМТА.

bk_ ★★
()

коротким решение не получилось.

.code64
LAST = 0x30
.data
format_out:	.string	"%ld\n"

.text
.globl main
	.type	main, @function

write:
	pushq	%rcx
	pushq	%rax
	movq	%rax,%rsi
	movq	$format_out, %rdi
	xorq	%rax,%rax
	call	printf
	popq	%rax
	popq	%rcx
	ret

main:
	movq	$LAST,%rcx
	movq	$1,%rax
	call	write
	call	write
	movq	$1,%rbx
for:	
	addq	%rbx,%rax
	call	write
	xchgq	%rbx,%rax
	loopq	for

	movl	$1,%eax
	int	$0x80

luke ★★★★★
()
In [3]: a = b = 1

In [4]: for i in range(100):
   ...:     a, b = a + b, a
   ...:     print a
provaton ★★★★★
()
Ответ на: комментарий от alfix

И всё-равно не соответствует условиям. Если переложить на питон, то нужна простая лямбда.

baverman ★★★
()

Если сойдет не очень точно, то:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        int N;
        int F;
        double s5 = sqrt(5.0);
        double phi1 = (1.0 + s5) / 2.0;

        if (argc != 2 || (N = atoi(argv[1])) <= 0) {
                fprintf(stderr, "Usage: %s n\n", argv[0]);
                fprintf(stderr, "\tn is natural number\n");
                return 1;
        }

        F = pow(phi1, N) / s5 + 0.5;

        printf("%d! = %d\n", N, F);

        return 0;
}

Подробнее здесь.

rymis ★★
()
Ответ на: комментарий от Deleted

На которую в условии наложен явный запрет. Я понимаю, конечно. Ъ и всё такое, но не настолько же.

Zenom ★★★
() автор топика
Ответ на: комментарий от Zenom

Если рекурсию, итерацию и формулу использовать нельзя, то найти число Фибоначчи нельзя (т.к. любое решение сведется либо к рекурсии, либо к итерации, либо к формуле, можно замаскировать спец. извратами с языком, но оно не перестанет быть рекурсией, итерацией или формулой).

Deleted
()
Ответ на: комментарий от Deleted

Если рекурсию, итерацию и формулу использовать нельзя, то найти число Фибоначчи нельзя

Но каким боком это относится к сабжу?

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.