我在哪裏可以找到Recaman序列的遞歸算法?所有發佈的算法都是迭代類型的。語言並不重要。Recaman的序列遞歸算法
-1
A
回答
1
這裏是在Python的解決方案:
def rec(x):
if x == 1:
list.append(x)
return x
else:
a = rec(x-1)
am = a - x
ap = a + x
if am > 0 and am not in list:
list.append(am)
return am
else:
list.append(ap)
return ap
list=[]
return rec(x)
+1
不錯,但是這是否算作遞歸算法,在全局列表上運行?至少我會發現它更加優雅地傳遞數組(或引用它)作爲額外的參數。 –
0
在方案您可以使用
(define (inseq seq n m)
(cond
((= 0 n) #f)
(else (or (= m (seq n)) (inseq seq (- n 1) m)))))
(define (lower n)
(- (rec (- n 1)) n))
(define (higher n)
(+ (rec (- n 1)) n))
(define (rec n)
(cond
((= 1 n) 1)
((and (> (lower n) 0) (not (inseq rec (- n 1) (lower n)))) (lower n))
(else (higher n))))
計算系列。這是遞歸的(但效率低下,非常不雅觀)。
0
我個人覺得這個問題本身很有趣。
首先,一個純粹的(即無副作用)在Python遞歸實現:
def recaman_sequence(n):
def recurs(seen, i, term):
if i > n:
return []
elif term > i and term - i not in seen:
return [term - i] + recurs(seen.union({term - i}), i + 1, term - i)
else:
return [term + i] + recurs(seen.union({term + i}), i + 1, term + i)
return recurs(set(), 1, 0)
與尾部調用優化語言,像OCaml中,更快的實現可能是沿着這些線路:
然而要注意List.mem
爲O(n)。在O(log n)或O(1)(如Python中的set
)中,更高級的版本將使用此操作的單獨累加器。
OEIS在哈斯克爾,可讀性很強這樣一個版本,但同樣不是尾遞歸(由於萊因哈德Zumkeller,2011年3月14日):
import Data.Set (Set, singleton, notMember, insert)
a005132 n = a005132_list !! n
a005132_list = 0 : recaman (singleton 0) 1 0 where
recaman :: Set Integer -> Integer -> Integer -> [Integer]
recaman s n x = if x > n && (x - n) `notMember` s
then (x-n) : recaman (insert (x-n) s) (n+1) (x-n)
else (x+n) : recaman (insert (x+n) s) (n+1) (x+n)
相關問題
- 1. 遞歸時間序列分割算法
- 2. 遞歸計算序列
- 3. 遞歸算法
- 4. 尾遞歸算法歸併
- 5. 遞歸序列化方法
- 6. 遞歸排序算法的決策樹
- 7. 遞歸算法樹
- 8. 加速遞歸行列式算法
- 9. 排序與重複算法與遞歸
- 10. 快速排序算法(遞歸)
- 11. 預算行程的遞歸算法
- 12. 遞歸序列的迭代方法
- 13. 序言 - 遞歸計算
- 14. 遞歸算法僞代碼
- 15. Matlab NQueens算法遞歸
- 16. 遞歸爬樓梯算法
- 17. 建立從遞歸算法
- 18. 運行遞歸算法
- 19. 我需要遞歸算法
- 20. 調試遞歸算法
- 21. 算法遞歸公式
- 22. 如何給遞歸算法
- 23. Karatsuba算法太多遞歸
- 24. 複雜遞歸算法
- 25. 算法/遞歸樹挑戰
- 26. 遞歸詞搜索算法
- 27. Java MergeSort算法遞歸
- 28. 用遞歸算法中
- 29. SIGSEGV與遞歸算法
- 30. MiniMax遞歸算法(Python)
下面是你應該用它來改善典型澄清的問題你題。你想做什麼?你有什麼嘗試?爲什麼它需要遞歸而不是迭代?爲什麼不能將迭代算法自己轉換爲遞歸算法?爲什麼你需要代碼,但是語言是不可知的?因此,這個問題太廣泛了,所以我會標記它,除非/編輯它以澄清和改進問題 –
我同意Kevin Wells,但我仍然覺得這個話題非常有趣。這裏的困難在於遞歸規則依賴於序列中的所有以前的數字。 –