2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Хвостовая рекурсия Haskell
Сообщение10.04.2020, 01:14 
Заслуженный участник


27/04/09
28128
warlock66613 в сообщении #1453225 писал(а):
Я бы ещё переименовал h в go - это общепринятое название для функции-шага хвостовой рекурсии и его использование упростит чтение кода другими людьми.
О, надо запомнить.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 00:45 


11/12/16
403
сБп
Оказывается я не до конца разобрался с синтаксисом и логикой Haskell. Хочу рассчитать сумму функционального ряда.

Вот например, начал с простого:
Используется синтаксис Haskell
--- просто сумма целых чисел от x1 до x2 (включительно)
sumx x1 x2 = go x1 0
    where
      go i acc = if i > x2 then acc else go (i + 1) (acc + i)


Хотелось бы сделать по аналогии. Думаю, код должен остаться почти такой же. Просто куда то добавить f. Однако не получается.

Используется синтаксис Haskell
--- сумма значений функции f от x1 до x2 (включительно)
sumfx f x1 x2 = go x1 0
    where
      go i acc = if i > x2 then acc else go (i + 1) (f (acc + i))
 

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 11:00 
Заслуженный участник


02/08/11
6892
gogoshik, а вот попробуйте объявить тип вашей функции как
Используется синтаксис Haskell
sumfx :: (Ord i, Num i, Num f) => (i -> f) -> i -> i -> f
и вам компилятор подскажет где ошибка.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 14:22 


05/09/12
2587
gogoshik в сообщении #1453458 писал(а):
с синтаксисом и логикой Haskell

Лукавство. Напишите то же самое на любом другом языке (условно-человеческом, без фортов, аплей и брейнфаков), который вы знаете. Здесь Хаскель ни при чем, кот получится абсолютно тот же, причем для всех задач в этой теме.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 15:25 


11/12/16
403
сБп
_Ivana в сообщении #1453564 писал(а):
Лукавство.
Почему Вы так решили? Не надо разбрасываться словами!

Например, это вполне работает и мне понятно (по крайней мере с написанием кода проблем не было):
Используется синтаксис Python
from math import *
def sumfmath(f, x1, x2):
    i = x1
    accf = 0
    while i <= x2:
        currf = f(i)
        accf = accf + currf
        i += 1      
    return accf


А вот то же самое для Haskell, без циклов, понять пока не могу. Прошла одна неделя, как начал изучать Haskell. Пока не разобрался.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 15:39 


05/09/12
2587
gogoshik в сообщении #1453572 писал(а):
Почему Вы так решили?

Потому что я знаю.
gogoshik в сообщении #1453572 писал(а):
Не надо разбрасываться словами!

Вам не впрок, я понимаю. Но может кто здравомыслящий эту тему будет читать.
gogoshik в сообщении #1453572 писал(а):
А вот то же самое для Haskell, без циклов

Не надо для Хаскеля, то же самое на Питоне напишите сначала, без циклов, рекурсиями, как хвостовой, так и не хвостовой.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 15:55 
Заслуженный участник


27/04/09
28128
gogoshik
Кстати потом не забудьте, что sumfx f x1 x2 вы сможете также записать как sum (map f [x1..x2]), ну когда уже будете использовать не в контексте изучения самого языка.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:07 


11/12/16
403
сБп
_Ivana в сообщении #1453575 писал(а):
Потому что я знаю.
Хорошо. Тогда напишите, пожалуйста, для примера следующий код в Python интерпретации:

Используется синтаксис Haskell
seQ n | n >= 0      = seqHelp n 3 2 1
      | otherwise   = error "arg must be >= 0"

seqHelp 0 _ _ pp = pp
seqHelp 1 _ p _  = p
seqHelp 2 c _ _  = c
seqHelp n c p pp = let q = c + p - 2 * pp in seqHelp (n - 1) q c p


Хотелось бы увидеть пример.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:16 


05/09/12
2587
На этом форуме правила запрещают размещать за автора темы решения его простых учебных задач. И это правильно. Напишите сами, и увидите. Заодно поймете, что проблемы у вас вовсе не с Хаскелем, как вы тут всех пытаетесь убедить, а с банальной рекурсией как таковой, независимо от языка и синтаксиса. Если сложно, можете начать с фибоначч. Благо в сети они разжеваны везде.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:27 


11/12/16
403
сБп
_Ivana в сообщении #1453586 писал(а):
На этом форуме правила запрещают размещать за автора темы решения его простых учебных задач.
Моя цель -- изучить Haskell, а не Python. Задачу я на Haskell решил. Код её привел.

Используется синтаксис Haskell
seQ n | n >= 0      = seqHelp n 3 2 1
      | otherwise   = error "arg must be >= 0"

seqHelp 0 _ _ pp = pp
seqHelp 1 _ p _  = p
seqHelp 2 c _ _  = c
seqHelp n c p pp = let q = c + p - 2 * pp in seqHelp (n - 1) q c p

Поэтому Вы не нарушите правила. К тому же я ничего не утверждаю про другие языки программирования. Утверждаете Вы. Поэтому было бы с Вашей стороны честно, продемонстрировать доказательство на Python!

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:32 


05/09/12
2587
gogoshik в сообщении #1453588 писал(а):
Поэтому было бы с Вашей стороны честно, продемонстрировать доказательство!

В данном случае достаточно традиционного "это очевидно" :-)

ЗЫ изучить Хаскель не умея рекурсию это примерно как научиться играть в футбол не умея ходить. И при этом списывать возникающие трудности на плохое знание правил :-)

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 16:52 
Заслуженный участник


27/04/09
28128
_Ivana
Мне вот лично кажется, что ваш вклад в этой теме недостаточно конструктивен. «А, да ты не знаешь того и этого» — это очень полезный совет, да. Человек сам бы не додумался погуглить и книжки почитать, ага. Если вам не на кого по какой-то причине выговориться, это не проблема топикстартеров раздела по программированию, уж извините.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 17:02 


05/09/12
2587
arseniiv, а мне кажется, что я единственный в этой теме точно диагностировал основную причину затруднений ТС, и предложил конкретные конструктивные пути ее преодоления, вместо советов типа свертки по мапу. И что будем делать с нашими такими различными субъективными ощущениями? Если вам лично что-то кажется, то имхо можно для начала подвергнуть это непредвзятому критическому анализу, и уж совсем не обязательно озвучивать это в теме.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 19:06 
Заслуженный участник


27/04/09
28128

(Оффтоп)

_Ivana в сообщении #1453597 писал(а):
вместо советов типа свертки по мапу
А это совет был на будущее, чтобы ТС потом не писал велосипеды. Сейчас конечно дело в другом, просто мне хотелось сначала посмотреть на реакцию на предложение warlock66613, а потом может что-то ещё рекомендовать, если что-то останется вообще нужно, так что я добавил то дополнение, которое вреда уж точно никому не делает.

_Ivana в сообщении #1453597 писал(а):
И что будем делать с нашими такими различными субъективными ощущениями?
Ничего не будем делать. Вы действуете как считаете нужным, я тоже. Диагностика диагностикой, а можно быть как-то приветливее.

_Ivana в сообщении #1453597 писал(а):
Если вам лично что-то кажется, то имхо можно для начала подвергнуть это непредвзятому критическому анализу, и уж совсем не обязательно озвучивать это в теме.
Спасибо за совет, я им обязательно когда-нибудь воспользуюсь.

 Профиль  
                  
 
 Re: Хвостовая рекурсия Haskell
Сообщение11.04.2020, 19:18 
Заслуженный участник


09/05/12
25179
 !  Может быть, педагогический диспут стоит устроить в ЛС? Хотя, _Ivana, я согласен с вашими оппонентами - пользы от такого вмешательства в беседу крайне мало.

Да, если что: правила запрещают решать простые учебные задачи за участника; если же задача сформулирована отвечающим, то ему не возбраняется ее решить.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group