2013-09-28 1 views
0

Я пытаюсь написать функцию в Haskell для генерации треугольного числа, я не разрешается использовать рекурсию, я должен использовать итерационныйГенерация треугольного числа с помощью итерации в Haskell

вот мой код ...

triSeries 0 = [0] 
triSeries n = take n $iterate (\x->(0+x)) 1 

Я знаю, что моя функция после итерации неправильная. Но Часы искали функцию, любой намек, пожалуйста?

ответ

1

Может wikipedia может быть намек, где что-то вроде

triangular :: Int -> Int 
triangular x = x * (x + 1) `div` 2 

может быть получен из.

triSeries может быть что-то вроде

triSeries :: Int -> [Int] 
triSeries x = map triangular [1..x] 

и работает как то

> triSeries 10 
[1,3,6,10,15,21,28,36,45,55] 

Говоря о iterate. Может быть, есть способ использовать его здесь, но, как сказал Джон, достаточно было foldl. Взгляните на this page, что вы ищете в самом начале.

+0

Я не думаю, что это решение закрытой формы считается итерацией. Хотя это, безусловно, лучший подход. –

+0

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

+0

это не сработало – user2277918

1

Старт выписыванием некоторые треугольные числа

  • T (1) = 1
  • Т (2) = 1 + 2
  • Т (3) = 1 + 2 + 3

Итерационный процесс для генерации T(n) должен начинаться с [1..n], взять первый элемент списка и добавить его в общую сумму. В языке с изменяемым состоянием, вы можете написать:

def tri(n): 
    sum = 0 
    for x in [1..n]: 
    sum += x 
    return sum 

В Haskell, вы можете итеративно потреблять список номеров и накапливают состояние с помощью fold функции (foldl, foldr, или какой-либо вариант). Надеюсь, этого достаточно, чтобы начать.

0

Непонятно, что означает «рекурсия не допускается, используйте итерацию». Все функции, которые кажутся «итеративными», являются рекурсивными внутри.

iterate во всех ваших целях может изменять только вход с константой, а iterate (+1) 1 - это то же, что и [1..]. Рассмотрите возможность использования Data.List функцию, которая может объединить несколько из бесконечного диапазона [1..] и ранее вычисленную сумму, чтобы произвести бесконечный список таких сумм:

T_i = я + T_ {я-1}

Это определенно дешевле чем x*(x+1) div 2

Рассмотрите возможность использования функции Data.List, которая может создавать бесконечный список конечных списков сумм из бесконечного списка сумм. Это будет дешевле, чем вычисление списка из 10, затем список из 11 повторяющихся тех же вычислений, выполненных для списка из 10 и т. Д.

Смежные вопросы