6 / 6 / 8
Регистрация: 03.01.2013
Сообщений: 116
1

Избавиться от одной рекурсии

18.09.2013, 21:11. Показов 888. Ответов 8
Метки нет (Все метки)

Всем доброго времени суток.

Вот код программы

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(* N - целочисленный параметр *)
load "Math";
(* Подключаем библиотеку для функции логарифма *)
fun y N =
  let
    val rN = real N
    
     (* Внутренний цикл (сумма): подсчет i-го слагаемого
     * складываем с j-й слагаемым результата slag *)
    fun jIter (i, j, slag) =    
      if j > rN then slag
      else jIter (i, j + 1.0, slag + Math.ln i / Math.ln j)
      
    (* Внешний цикл (сумма):
     * добавление i-го слагаемого (при i<=N) к результату rez *)
    fun iIter (i, rez) =
      if i > rN then rez
      else iIter (i + 1.0, rez + jIter (i, 2.0, 1.0));
  in
    (* Запускается цикл по i (сумма) от 1.0  *)
    iIter (1.0, 0.0)
  end;
Язык Язык Standart ML , но он очень похож на Хаскель

Он считает двойную сумму ln(i)/ln(j)

Подскажите пожалуйста, как это реализовать с помощью одной хвостовой рекурсией ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2013, 21:11
Ответы с готовыми решениями:

Избавиться от рекурсии
Нужно в данной процедуре избавиться от рекурсии. Не могу понять как это сделать. masreal -...

Избавиться от рекурсии
Здравствуйте. У меня имеется рекурсивный метод: static void dfs(int v, int last){ ...

Избавиться от рекурсии
Каким способом лучше всего избавиться от рекурсии ?

Избавиться от повтора вариантов при рекурсии
#include &lt;stdio.h&gt; void find (int *s ,int n) { int max = (n-1)/3; for (int b = 1;...

8
Модератор
Эксперт функциональных языков программированияЭксперт Python
30647 / 16874 / 3476
Регистрация: 12.02.2012
Сообщений: 28,284
Записей в блоге: 5
18.09.2013, 21:44 2
А зачем здесь рекурсия вообще? Вот:

Haskell
1
2
3
Prelude> sum [(log i)/(log j) | i <- [2..10], j<-[2..10]]
 
92.7099
1
6 / 6 / 8
Регистрация: 03.01.2013
Сообщений: 116
18.09.2013, 21:48  [ТС] 3
Цитата Сообщение от Catstail Посмотреть сообщение
А зачем здесь рекурсия вообще? Вот:

Haskell
1
2
3
Prelude> sum [(log i)/(log j) | i <- [2..10], j<-[2..10]]
 
92.7099
К сожалению циклов быть не должно, только одна хвостовая рекурсия
0
Эксперт по математике/физике
4156 / 2059 / 424
Регистрация: 19.07.2009
Сообщений: 3,117
Записей в блоге: 24
18.09.2013, 23:32 4
Цитата Сообщение от TheAlpha Посмотреть сообщение
К сожалению циклов быть не должно, только одна хвостовая рекурсия
Формально говоря, там не было циклов. Хотя бы только потому, что в Хаскеле вообще циклов нет.

Но могу предложить такое, в соответствии с Вашим кодом на ML
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
import Data.Function(on)
 
f v min max = let
  a i j r -- inner
    | j > max = r
    | otherwise = a i (j+1) (r + v i j)
  b i r -- outer
    | i > max = r
    | otherwise = b (i+1) (a i min r)
  in b min 0
 
ll = on (/) (log . fromInteger) -- log i / log j
Добавлено через 30 секунд
Haskell
1
2
*Main> f ll 2 10
92.70994991821792
2
78 / 64 / 5
Регистрация: 25.03.2012
Сообщений: 71
19.09.2013, 04:59 5
Цитата Сообщение от TheAlpha Посмотреть сообщение
Подскажите пожалуйста, как это реализовать с помощью одной хвостовой рекурсией ?
Как вариант:
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
local open Math in
fun f mn mx  = 
    let 
    val (mnr, mxr) = (real mn, real mx)
(**)
    fun f_aux a b res =
        if b > mxr then
        f_aux (a + 1.0) mnr res
        else if a > mxr then
                res
        else
        f_aux a (b + 1.0) (res + ln a/ln b)
    in
    f_aux mnr mnr 0.0
    end     
end
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
30647 / 16874 / 3476
Регистрация: 12.02.2012
Сообщений: 28,284
Записей в блоге: 5
19.09.2013, 21:02 6
Вот еще одно решение (с единственной рекурсией):

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- генерация пар
 
nextC :: (Int,Int) -> Int -> Int -> (Int,Int)
nextC (x,y) min max | (y < max)  = (x,y+1)
                    | (x == max) = (0,0)
                    | otherwise  = (x+1,min)
 
-- собственно расчет
                    
sumLog :: (Int,Int) -> Int -> Int -> Double
sumLog (x,y) min max  | ((x,y) == (0,0)) = 0.0
                      | otherwise = (sumLog nextP min max) +  (flog  x)/(flog y)
                        where nextP = nextC (x,y) min max;
                              flog = log . fromInt 
 
Main> sumLog (2,2) 2 10
 
92.7099
1
2 / 2 / 1
Регистрация: 15.10.2015
Сообщений: 173
19.02.2017, 15:21 7
Помогите с примером. Хотелось бы не использовать рекурсию, но пока только такое решение по перестановке элементов списка местами..

Haskell
1
2
3
4
changePos [] = []
changePos [x] = [x]
changePos (x:y:[]) = y:x:[]
changePos (x:y:xs) = y:x:[] ++ changePos xs
0
4265 / 2806 / 410
Регистрация: 01.06.2013
Сообщений: 5,892
Записей в блоге: 9
19.02.2017, 17:07 8
SKY_SHY, вы же уже спрашивали. Переставить элементы списка местами
1
2 / 2 / 1
Регистрация: 15.10.2015
Сообщений: 173
19.02.2017, 19:08 9
Точно, спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2017, 19:08

Задача о расстановке n ферзей на доске n на n: как избавиться от рекурсии?
Помогите упростить данный код. Что бы было все в одной функции #include&lt;iostream&gt; #include...

Как избавиться от переполнения стека при глубокой рекурсии?
Добрый день, Я написала рекурсивную функцию которая считает сложение дробей при n = 1000...

Почему компьютер работал с одной памятью в целом слоте, но отказывался работать с одной в целом и одной в сгоревшем? (Не понимаю!)
Ребята, привет! Была проблема: включаю компьютер, экран &quot;no signal&quot;, компьютер что-то...

Нужно сделать одной командой несколько окружностей находящихся в одной окружности
Пожалуйста

Как добавить несколько файлов одной кнопкой и в одной форме php
Здравствуйте! Как добавить несколько файлов одной кнопкой и в одной форме php Например есть такая...

Вытаскиваем необходимые данные из одной таблицы и вписываем в другую на одной странице
Всем привет ..... сразу к делу &lt;?php $res = mysql_query(&quot;SELECT id FROM `album`...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru