Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

recursive algoritma


Tcpip

Öne çıkan mesajlar

bir soru var, ugrastım da çözemedim belki recursive ile arası iyi olan vardır.

using "1 2 3 4 5 6 7 8 9 10" integers number make a set that sum 30. how many set you can do.

örneğin 30 tane 1 olabilir
yada 28 tane 1 + 1 tane 2
yada 27 tane 1 + 1 tane 3
yada 26 tane 1 + 2 tane 2
yada 26 tane 1 + 1 tane 4

ağaç yapısı ile yada recursive fonksiyon yazarak çözülebileceğine inanıyorum da bir türlü kafamı toplayamadım.
Link to comment
Sosyal ağlarda paylaş

Ben senin tam dediğini değilde şöyle birşey yazmıştım, hatta recursion kullanarak.

Elimizde iki sayı var, mesela 10 ve 5, P(10,5) diyelim. Yazdığım fonksiyon 10 toplamına 5 sayının toplamı olarak kaç farklı şekilde ulaşılabileceğini buluyordu, hatta konusunu da buldum

http://forum.paticik.com/read.php?6,4460948,page=1

ilk sayfanın en sonunda kodu da yazmışım. Belki bunu uyarlayarak falan bişeyler yapabilirsin
Link to comment
Sosyal ağlarda paylaş

Ben de kitaptaki metodlardan birini hatırladım.
Bi n sayısı için (n-1, 1) ikilisinden başlıyosun, (1, 1, 1...) olana kadar gidiyosun. Her adımda en soldaki sayı hariç tüm sayıları 1 yapmaya çalışıyosun. Onu yaptıktan sonra en soldaki sayıyı bi azaltıp, hemen sağındaki sayıyı 1 artırıyosun.

Örneğin 8 var elimde. 7 + 1 şeklinde açıyorum ilk

7 1

Şimdi en soldaki hariç tek sayı 1 olduğu için en soldaki sayıyı 1 azaltıp hemen sağındakini 1 artırıyorum

6 2

En soldaki hariç tümünü 1 yapmam lazım,

6 1 1

En soldakini 1 azaltıp sağındakini artırıyorum

5 2 1

1'lere açıyorum

5 1 1 1

Devam...

4 2 1 1
4 1 1 1 1
3 2 1 1 1
3 1 1 1 1 1
2 2 1 1 1 1
2 1 1 1 1 1 1
1 1 1 1 1 1 1 1


Toplam 12 farklı şey oldu. Bunun gibi. Örnek kodu evde ama, onu anca akşam verebilirim :P

Edit: Dur ya eksik hatırlamışım, 4 3 1 falan yok bunda. Biraz daha zorliim bakiim.
Link to comment
Sosyal ağlarda paylaş

f(n) fonksiyonu n tane sayıyı hangi şekillerde yazabileceğini gösteren, sayı dizilerinden oluşan bir küme versin.

addToAll(e, s) ise e elemanını s kümesindeki tüm dizilerin başına ekleyen bir fonksiyon olsun. Örnek:

addToAll(1, {[1, 1], [2]}) = {[1, 1, 1], [1, 2]}


U ise permutasyonları eleyen bir küme birleşim operatörü olsun. Örnek:

{[1, 2]} U {[2, 1]} = {[1, 2]}



{ {[1]}, if n = 1
f(n) = {
{ {[n]} U ( U i in (1 to n-1) addToAll(i, f(n - i)) ), otherwise


Örnek:

f(2) = {[2]} U addToAll(1, f(1))
f(2) = {[2]} U {[1, 1]}
f(2) = {[2], [1, 1]}

f(3) = {[3]} U ( addToAll(1, f(2)) U addToAll(2, f(1)) )
f(3) = {[3]} U {[1, 2], [1, 1, 1]} U {[2, 1]}
f(3) = {[3], [1, 2], [1, 1, 1]}

f(4) = {[4]} U ( addToAll(1, f(3)) U addToAll(2, f(2)) U addToAll(3, f(1)) )
f(4) = {[4]} U {[1, 3], [1, 1, 2], [1, 1, 1, 1]} U {[2, 2], [2, 1, 1]} U {[3, 1]}
f(4) = {[4], [1, 3], [1, 1, 2], [1, 1, 1, 1], [2, 2]}


Aradığın fonksiyon ise f(n)'in eleman sayısı.
Link to comment
Sosyal ağlarda paylaş

Canım sıkıldı yukarda belirttiğim algoritmayı javada yazdım. Yalnız süre karesel arttığı için 25'ten sonrası değerler için aşırı uzun sürmeye başladı. 30 için 2-3 dakkada bile cevap bulamadı. Ufak bir cache yazınca sonucu 5604 olarak buldu:

Cache'siz


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Paticik {

public static Set<List<Integer>> f(int n) {
Set<List<Integer>> results = new HashSet<List<Integer>>();
List<Integer> possibleValues = new ArrayList<Integer>();
possibleValues.add(n);
results.add(possibleValues);

if (n > 1) {
for (int i = 1; i < n; i++) {
Set<List<Integer>> possibleValuesForNMinus1 = f(n - i);
addToAll(i, possibleValuesForNMinus1);
results.addAll(possibleValuesForNMinus1);
}
}

return results;
}

public static void addToAll(int n, Set<List<Integer>> set) {
for (List<Integer> list : set) {
list.add(n);
Collections.sort(list);
}
}

public static void main(String[] args) {
Set<List<Integer>> f = f(30);
System.out.println(f);
System.out.println(f.size());
}

}



Cache'li


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class PaticikCached {

private static Map<Integer, Set<List<Integer>>> cache = new HashMap<Integer, Set<List<Integer>>>();

public static Set<List<Integer>> f(int n) {
if (cache.containsKey(n)) {
return cache.get(n);
}

Set<List<Integer>> results = new HashSet<List<Integer>>();
List<Integer> possibleValues = new ArrayList<Integer>();
possibleValues.add(n);
results.add(possibleValues);

if (n > 1) {
for (int i = 1; i < n; i++) {
Set<List<Integer>> possibleValuesForNMinus1 = clone(f(n - i));
addToAll(i, possibleValuesForNMinus1);
results.addAll(possibleValuesForNMinus1);
}
}

cache.put(n, results);
return results;
}

public static void addToAll(int n, Set<List<Integer>> set) {
for (List<Integer> list : set) {
list.add(n);
Collections.sort(list);
}
}

private static Set<List<Integer>> clone(Set<List<Integer>> set) {
Set<List<Integer>> setClone = new HashSet<List<Integer>>();
for (List<Integer> list : set) {
List<Integer> listClone = new ArrayList<Integer>(list.size());
for (int i : list) {
listClone.add(i);
}
setClone.add(listClone);
}
return setClone;
}

public static void main(String[] args) {
Set<List<Integer>> f = f(30);
System.out.println(f);
System.out.println(f.size());
}

}

Link to comment
Sosyal ağlarda paylaş

3590 cıktı benimkinde :)
3 ayrı class var, ayrı ayrı yapıstırdım.

edit: Node classını unutmusum, 4 class var.

Code



public class Node {

public int value;
public int count;
public Node(int value, int count) {
super();
this.value = value;
this.count = count;
}

}

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
NodeOrder nodeOrder = new NodeOrder(30);
nodeOrder.findAllPossibleList();
nodeOrder.writePossibleList();

}

}


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class NodeOrder {

private int maxInput = 10;
private List<NodeList> possibleNodeList = new ArrayList<NodeList>();

public NodeOrder(int n){
List<Node> nodeList = new ArrayList<Node>();
nodeList.add(new Node(1, n));
possibleNodeList.add(new NodeList(nodeList));
}

public void findAllPossibleList() {
int size = possibleNodeList.size();
iterate();
while(size != possibleNodeList.size()){
size = possibleNodeList.size();
iterate();
}
}

public void writePossibleList(){
System.out.println(possibleNodeList.size());
for(NodeList nodeList : possibleNodeList){
for(Node node : nodeList.nodeList){
if (node.count == 0)
continue;
for(int k=0; k<node.count; k++){
System.out.print(node.value);
}
}
System.out.println();
}
}

private void iterate(){
List<NodeList> nextStates = new ArrayList<NodeList>();
for(NodeList nodeList : possibleNodeList) {
if (nodeList.iterated)
continue;
for(int k=0; k<nodeList.nodeList.size(); k++){
Node first = nodeList.nodeList.get(k);
if (first.count == 0)
continue;
if (first.count > 1) {
int newValue = first.value * 2;
if (newValue <= maxInput) {
nextStates.add(createNewState(nodeList.nodeList, first, first));
}
}
for(int m=k+1; m<nodeList.nodeList.size(); m++){
Node second = nodeList.nodeList.get(m);
if (second.count == 0)
continue;
int newValue = first.value + second.value;
if (newValue <= maxInput){
nextStates.add(createNewState(nodeList.nodeList, first, second));
}
}
}
nodeList.iterated = true;

}

for(NodeList nodeList : nextStates){
if (!isExistNodeList(nodeList)){
possibleNodeList.add(nodeList);
}
}
}

private boolean isExistNodeList(NodeList nodeList){
String identifier = nodeList.getIdentifier();
for(NodeList nodeListPoss : possibleNodeList){
if (nodeListPoss.getIdentifier().equals(identifier))
return true;
}
return false;
}

private static List<Node> clone(List<Node> nodeList){
List<Node> newList = new ArrayList<Node>();
for(Node node : nodeList){
newList.add(new Node(node.value, node.count));
}

return newList;
}

private NodeList createNewState(List<Node> nodeListOld, Node first, Node second){

int newValue = first.value + second.value;
boolean foundNewValue = false;

List<Node> nodeList = clone(nodeListOld);
for(Node node : nodeList) {
if (node.value == first.value){
node.count--;
}
if (node.value == second.value){
node.count--;
}
if (node.value == newValue){
foundNewValue = true;
node.count++;
}
}
if (!foundNewValue){
nodeList.add(new Node(newValue, 1));
}

return new NodeList(nodeList);

}

}

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;


public class NodeList {

public List<Node> nodeList = new ArrayList<Node>();
public boolean iterated = false;

public NodeList(List<Node> nodeList){
this.nodeList = nodeList;
Collections.sort(nodeList, new Comparator<Node>() {

@Override
public int compare(Node arg0, Node arg1) {
return new Integer(arg0.value).compareTo(new Integer(arg1.value));
}
});
}

public String getIdentifier() {


StringBuffer identifier = new StringBuffer();
for(Node node : nodeList) {
if (node.count == 0)
continue;
identifier.append(node.count).append(node.value);
}

return identifier.toString();
}

}




Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...