Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 26.03.2010
Сообщений: 4
1

Как цикл заменить рекурсией подскажите пожалуйста

16.01.2013, 17:49. Показов 1097. Ответов 3
Метки нет (Все метки)

С циклом сделал а вот с рекурсией не могу понять. если кто может помоч буду очень признателен!!!
вот код:

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
module Fractal
 
open System
open System.Drawing
open System.Windows.Forms
open System.Numerics
open System.Linq
 
type Direction = 
  N = 0
 | E = 1
 | S = 2
 | W = 3
 
type Rotate = 
  Left = -1
 | None = 0 
 | Right = 1
 
type Rule = { state:char; clr:Color; nclr:Color; rot:Rotate; nstate:char }
type Evil = { point:Point; state:char; dir:Direction }
type EvilRule = { evil:Evil; rule:Rule }
 
let GetNextEvilState (image:Bitmap, rules:Rule[], evils:Evil[]) =
    let IsRuleCorrect (evil:Evil) (rule:Rule) = 
            evil.state=rule.state && image.GetPixel(evil.point.X,evil.point.Y).ToArgb()=rule.clr.ToArgb()
 
    let evilRules = evils.Select(fun e -> {evil = e; rule = rules.First(fun r -> IsRuleCorrect e r)}).ToList()
    
    for (evilrule:EvilRule) in evilRules do
        image.SetPixel(evilrule.evil.point.X,evilrule.evil.point.Y,evilrule.rule.nclr) 
    
    let MoveEvil (evil:Evil) (rule:Rule) =
        let GetNewDir (dir:Direction) (rot:Rotate) =
            enum<Direction>(((int)dir+(int)rot+4)%4)
        let Advance (point:Point) (dir:Direction) = 
            match dir with
            | Direction.N -> new Point(point.X,point.Y-1)
            | Direction.E -> new Point(point.X+1,point.Y)
            | Direction.S -> new Point(point.X,point.Y+1)
            | _ -> new Point(point.X-1,point.Y)
             
        let ndir = GetNewDir evil.dir rule.rot 
         
        {point=Advance evil.point ndir; state = rule.nstate; dir=ndir}
    
    evilRules.Select(fun evilRule -> MoveEvil evilRule.evil evilRule.rule).ToList()    
 
 
let GetNextCrystalState(image:Bitmap,data:int[,],rule:int) =
    let GetValue x y = 
        if x>=0 && x<image.Width && y>=0 && y<image.Height then 
            if image.GetPixel(x,y).ToArgb()=Color.White.ToArgb() then 1 else 0
        else 
            0
    let NotNullSiblings x y = 
        (GetValue (x-1) y)+(GetValue x y)+(GetValue (x+1) y)+(GetValue x (y-1))+(GetValue x (y+1))
    
    for i=0 to image.Width-1 do
        for j=0 to image.Height-1 do
            data.[i,j] <- NotNullSiblings i j
 
    for i=0 to image.Width-1 do
        for j=0 to image.Height-1 do
           let offset = 1<<<((if image.GetPixel(i,j).ToArgb()=Color.White.ToArgb() then 4 else 9)-data.[i,j])
           if (rule&&&offset)=0 then 
                image.SetPixel(i,j,Color.Black) 
           else
                image.SetPixel(i,j,Color.White)
    true
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.01.2013, 17:49
Ответы с готовыми решениями:

Заменить цикл рекурсией
Дана функция. float result(double x1, double e) { double x2; float temp; x2 = x1;...

Подскажите пожалуйста в чем ошибка с рекурсией?
Задание: Разработка рекурсивных методов ( не возвращающих значений). Задача. Разработать...

Есть код, как будет выглядеть блок-схема (цикл for), подскажите пожалуйста
#include &quot;stdio.h&quot; int main() { int i, j; printf(&quot;Delenie na 3 and 9\n&quot;); for(i =...

Подскажите пожалуйста как заменить текст или где почитать?
Подскажите пожалуйста как заменить текст или где почитать? ...

3
1193 / 586 / 88
Регистрация: 20.09.2012
Сообщений: 1,877
17.01.2013, 14:51 2
примерно так
F#
1
2
3
        for i=0 to image.Width-1 do
            for j=0 to image.Height-1 do
                data.[i,j] <- NotNullSiblings i j
в

F#
1
2
3
4
5
6
7
8
        let rec loop1 i j = 
            match i with
            | _ when i = image.Width -> ()
            | _ when j = image.Height -> loop1 (i + 1) 0
            | _ -> 
                data.[i,j] <- NotNullSiblings i j
                loop1 i (j + 1) 
        loop1 0 0
0
0 / 0 / 0
Регистрация: 26.03.2010
Сообщений: 4
17.01.2013, 15:03  [ТС] 3
pycture, Спасибо тебе pycture за помощь!!! Я тут немного поколдовал и тоже уже сделал но немного по другому.
как то так и вроде работает

F#
1
2
3
4
5
6
7
8
 
List.iter (fun x-> List.iter (fun y -> data.[x,y] <- NotNullSiblings x y) [0..image.Height-1]) [0..image.Width-1]
 
 List.iter (fun x-> List.iter (fun y -> let offset = 1<<<((if image.GetPixel(x,y).ToArgb()=Color.White.ToArgb() then 4 else 9)-data.[x,y])
 if (rule&&&offset)=0 then 
 image.SetPixel(x,y,Color.Black) 
 else
 image.SetPixel(x,y,Color.White)) [0..image.Height-1]) [0..image.Width-1]
0
1193 / 586 / 88
Регистрация: 20.09.2012
Сообщений: 1,877
17.01.2013, 15:53 4
F#
1
List.iter (fun x-> List.iter (fun y -> data.[x,y] <- NotNullSiblings x y) [0..image.Height-1]) [0..image.Width-1]
работает. но это не рекурсия
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2013, 15:53

Цикл: While не работает, подскажите, пожалуйста, где ошибка в коде?
Господа, While не работает, подскажите пожалуйста где ошибка в коде: import hashlib import...

Подскажите пожалуйста куда деть цикл что бы программа работала нормально?
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

Подскажите пожалуйста компилятор .java файлов на Android, или то, что может заменить JDK
Подскажите пожалуйста компилятор .java файлов на андроид, или то, что может заменить JDK. Заранее...

Бесконечный цикл -замена рекурсией
Привет всем. имеется код функции float expr() { float resplus=factor(); for(;;)


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.