2015-07-30 6 views
-1

У меня есть последовательность чисел следующим образом:Учитывая значение р, вернуть последний элемент последовательности <р - Fortran

1, 1, 5, 13, 41, 121, 365, ....

первые два значения:

Н (1) = 1 и N (2) = 1

Начиная с 3-го значения N (I) = 2 * N (I-1) + 3 * N (i-2)

Проблема, с которой я столкнулся: если я даю аргумент p, он должен вернуть мне последние значения последовательности < p (Использование fortran77).

Например, если р = 90, то она должна возвращать значение 41.

+3

Как 'len' или 'append' не родной python? – muddyfish

+0

Извините, мне позже нужно было бы ответить взаимностью в fortran, и, к сожалению, fortran не имеет этих функций. –

+0

Тогда зачем вообще писать его на питоне? – muddyfish

ответ

0

Предполагая, что у вас уже есть последовательность в переменной lst и p набор,

max(filter(lambda x:x<=p, lst)) 
+0

Он просто имеет последовательность и формулу для генерации следующего элемента, поэтому переменная 'lst'. –

2
a = 1 
b = 1 
while b < p: 
    c = 2 * b + 3 * a 
    a = b 
    b = c 
return a 

Фортран эквивалент:

function fct(p) result(a) 
    integer, intent(in) :: p 
    integer :: a, b, c 

    a = 1 
    b = 1 
    do while (b < p) 
     c = 2 * b + 3 * a 
     a = b 
     b = c 
    enddo 
end function 

program test 
    integer :: fct 
    external fct 
    print *,fct(90) 
end program 
+0

@MarkusMeskanen OP собирается перевести его в Fortran - я не думаю, что Fortran может это сделать. –

+0

Я добавил код Fortran ... Не стесняйтесь редактировать или откатываться, если вам это не нравится ;-) –

+0

@Alexander Большое спасибо! –

0
def get_last_element(p): 
    n1 = 1 
    n2 = 1 
    while True: 
     if n2 > p: 
      return n1 
     n1, n2 = n2, 2*n2 + 3 * n1 

print(get_last_element(90)) 
0

Я написал фрагмент кода в Fortran 2003. Я определил тип, который имеет память для двух последних частей последовательности. Процедура - это рекурсивная функция. Тип может использоваться автономно для получения n-й части последовательности или эффективного размещения в цикле для поиска частей в строке (не обязательно начиная с 1), поскольку у нее есть память предыдущих частей. (компилятор: gfortran 4.8).

Тип определяется в mymod.f90 файле, как

module mymod 
    implicit none 

    type seq_t 
     integer :: saved_i = 0, saved_val_i = 0, saved_val_i_1 = 0 
    contains 
     procedure :: getpart => getpart_seq 
    end type  

contains 

recursive function getpart_seq(this,i) result(r) 
    class(seq_t) :: this 
    integer, intent(in) :: i 
    integer :: r,r_1,r_2 

    if (i.eq.1.or.i.eq.2) then 
     r = 1 
    elseif(i.eq.this%saved_i) then 
     r = this%saved_val_i 
    elseif(i.eq.this%saved_i-1) then 
     r = this%saved_val_i_1 
    else 
     r_1 = this%getpart(i-1) 
     r_2 = this%getpart(i-2) 
     r = 2*r_1 + 3*r_2 
     this%saved_val_i_1 = r_1   
    end if 
    this%saved_i = i 
    this%saved_val_i = r 

end function getpart_seq 

end module mymod 

Основная программа для запрошенной случае

program main 
    use mymod 
    implicit none 
    type (seq_t) :: seq 
    integer :: i,p,tmp_new,tmp_old,ans 

! Set the threshold here 
    p = 90 
! loop over parts of the sequence  
    i = 0 
    do 
     i = i + 1 
     tmp_new = seq%getpart(i) 
     print*,tmp_new 
     if (tmp_new>p) then 
      ans = tmp_old 
      exit 
     end if  
     tmp_old = tmp_new 
    end do  
    print*,"The last part of sequence less then",p," is equal to",ans 
end program 

Результатом является

1 
1 
5 
13 
41 
121 
The last part of sequence less then   90 is equal to   41. 
Смежные вопросы